RunSonnet 5.5repeat 1
Single on HTTP 301 vs 308
claude-sonnet-5-5__single__research-http-redirects__r1
Score
1.000
- Cost
- $0.101
- + $0.077 judging
- Latency
- 24.4s
- setup 0.1s, grading 4.5s
- Turns
- 7
- Tool calls
- 6
- Subagents
- 0
- Tokens in / out
- 45k / 3.4k
- 28,731 read from cache
Did the design run?
- 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
Drawn from the phase records: timing and cost per call, no tool calls or messages.
| Phase | Duration | Cost | Turns | Tools | Model |
|---|---|---|---|---|---|
| Main | 24.4s | $0.101 | 7 | 6 | claude-sonnet-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
- A gate that blocked the right moveGated-execute · Haiku 4.5
- Three proposals beat one agentPropose-select · Haiku 4.5
- A verifier that earned its keepPlan-execute-verify · Sonnet 5.5
- A revision that did not helpPlan-execute-verify · Haiku 4.5
- The control, missing a stepSingle · Haiku 4.5
Record this cell yourself: npm run bench -- run --strategies single --tasks research-http-redirects --models claude-sonnet-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, E4. “Both codes say the target resource has been assigned a new permanent URI, and that future references should use the new 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 E7, E10. “A client that follows a 308 therefore repeats the same method (for example, POST stays POST) to the new URI.”
- 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 E2, E7. “"for historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request."”
- 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 E3, E5. “Both are cacheable by default. RFC 9110 calls each "heuristically cacheable," unless the method definition or explicit cache controls say otherwise.”
- 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, E10. “it obsoletes RFC 7231, which defined 301, and RFC 7538, which first defined 308.”
Penalties
No penalties were applied.
Scorer metadata
- corpus
- {"version":2,"snapshot":"2026-10-01","hash":"25fbed79c4f7f9e1b850436e0e4872f8e25dd80142f3177231c456f21817b817","documents":8}
- opened documents
- ["rfc9110","rfc7538"]
- opened by role
- {"primary":["rfc9110"],"superseded":["rfc7538"]}
- displayed share
- {"rfc9110":0.0396,"rfc7538":0.782}
- cited count
- 2
- verified count
- 2
- 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; clients may use Location for automatic redirection (RFC 9110 section 15.4.2).","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":"For 301, a user agent may change POST to GET, and 308 is the alternative if that is undesired.","quote":"For historical reasons, a user agent MAY change the","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"301 is heuristically cacheable.","quote":"A 301 response is heuristically cacheable; i.e., unless otherwise","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"308 means the resource has a new permanent URI (RFC 9110 section 15.4.9).","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":"308 is heuristically cacheable.","quote":"A 308 response is heuristically cacheable; i.e., unless otherwise","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"308 is younger than 301 and may not be recognized everywhere.","quote":"This status code is much younger (June 2014) than its","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"History: 301/302 were originally method-preserving but practice converged on GET; 307 and 308 were added to unambiguously indicate method-preserving redirects.","quote":"307 (Temporary Redirect) and 308 (Permanent Redirect) [RFC7538] were later added to unambiguously indicate method-preserving redirects, and status codes 301 and 302 have been adjusted to allow a POST request to be redirected as GET.","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"When following a redirect the client resends the original request, changing the method per the status code's semantics, and strips content headers if the method became GET/HEAD.","quote":"If the request method has been changed to GET or HEAD, remove","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"RFC 9110 obsoletes RFC 7538 (the original 308 spec) and RFC 7231.","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://www.rfc-editor.org/rfc/rfc7538.html","claim":"RFC 7538 defines 308 as like 301 except that it forbids changing POST to GET.","quote":"This status code is similar to 301 (Moved Permanently)","verified":true,"document":"rfc7538"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"RFC 7538 originally said 308 is cacheable by default.","quote":"A 308 response is cacheable by default; i.e., unless otherwise","verified":true,"document":"rfc7538"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"RFC 7538 warns that unknown 3xx codes are treated like 300, so 308 should be used only when clients are trusted to understand it.","quote":"Therefore, the use of status code 308 is restricted to cases where","verified":true,"document":"rfc7538"}]
- judge unverified quotes
- 0
- judge verdicts
- [{"names":{"status":"met","support":["E1","E4"]},"method-preserved-308":{"status":"met","support":["E7","E10"]},"method-change-301":{"status":"met","support":["E2","E7"]},"cacheable":{"status":"met","support":["E3","E5"]},"specifications":{"status":"met","support":["E9","E10"]}},{"names":{"status":"met","support":["E1","E4"]},"method-preserved-308":{"status":"met","support":["E10","E7"]},"method-change-301":{"status":"met","support":["E2","E7"]},"cacheable":{"status":"met","support":["E3","E5"]},"specifications":{"status":"met","support":["E9","E1","E4"]}},{"names":{"status":"met","support":["E1","E4"]},"method-preserved-308":{"status":"met","support":["E7","E10"]},"method-change-301":{"status":"met","support":["E2","E7"]},"cacheable":{"status":"met","support":["E3","E5"]},"specifications":{"status":"met","support":["E9","E10"]}}]
- judge failures
- 0
- grounded weight share
- 1
Final answer
A 301 and a 308 both tell the client that a resource has moved permanently. They differ in one thing: a 301 lets the client change a POST to a GET when it follows the redirect, and a 308 does not.
What each means
- Both codes say the target resource has been assigned a new permanent URI, and that future references should use the new URI. The two definitions in RFC 9110 use the same wording here.
- Both tell the server to send a
Locationheader with the preferred new URI. The client may use it to redirect automatically. - Both mention that a client with link-editing capability could permanently replace references to the old URI. RFC 9110 adds that this suggestion is usually ignored unless the client is actively editing content, the connection is secured, and the origin server is a trusted authority for that content.
Request method and body when following the redirect
301: RFC 9110 includes a note that "for historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request." This reflects history. In HTTP/1.0, 301 was defined as method-preserving, but early user agents split on whether to redirect a POST as a POST or as a GET. Practice converged on GET, and the spec was adjusted to allow it.
- Clients may therefore either keep the method or switch POST to GET, so the outcome is not guaranteed.
- When the method is changed to GET or HEAD, RFC 9110 says the client should remove content-specific header fields such as Content-Type and Content-Length. In practice the request body is dropped along with them.
308: RFC 7538 added it as the method-preserving permanent redirect. It says 308 is like 301 "except that it does not allow changing the request method from POST to GET."
- A client that follows a 308 therefore repeats the same method (for example, POST stays POST) to the new URI.
- RFC 9110 says a redirecting client should resend the original request message and change the method only "according to the redirecting status code's semantics." Since 308 allows no method change, the body is resent along with it. The spec does not state the body rule for 308 in a single sentence, so this is my reading of how those two rules fit together.
- RFC 9110 notes that automatic redirection needs care for methods not known to be safe, because the user might not want an unsafe request redirected.
Cacheability
- Both are cacheable by default. RFC 9110 calls each "heuristically cacheable," unless the method definition or explicit cache controls say otherwise.
- RFC 7538 used the wording "cacheable by default" for 308. RFC 9110 changed this to "heuristically cacheable," the same as 301.
- You can control caching explicitly with
Cache-ControlorExpires. Browsers often cache permanent redirects for a long time, so a mistaken one can be hard to undo.
Where each is specified today
- Both are specified in RFC 9110, "HTTP Semantics" (June 2022). 301 is in section 15.4.2 and 308 is in section 15.4.9. This is the current specification: it obsoletes RFC 7231, which defined 301, and RFC 7538, which first defined 308.
- RFC 7538 (April 2015) is the original standalone 308 specification. It is obsolete, but it is still the clearest statement of the 301/308 relationship.
- RFC 9110 notes that 308 is much younger than its sibling codes (June 2014) and might not be recognized everywhere. RFC 7538 says unknown 3xx codes are treated like 300 (Multiple Choices), so servers cannot rely on clients redirecting automatically. Use 308 where you trust the clients to understand it, or where falling back to 300 behaviour is harmless.
I opened only the two RFC pages cited below. Their sources do not disagree on any of these points; the one wording change, "cacheable by default" versus "heuristically cacheable," is between the two RFC versions.
{"evidence": [
{"claim": "301 means the resource has a new permanent URI; clients may use Location for automatic redirection (RFC 9110 section 15.4.2).", "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": "For 301, a user agent may change POST to GET, and 308 is the alternative if that is undesired.", "quote": "For historical reasons, a user agent MAY change the", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "301 is heuristically cacheable.", "quote": "A 301 response is heuristically cacheable; i.e., unless otherwise", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "308 means the resource has a new permanent URI (RFC 9110 section 15.4.9).", "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": "308 is heuristically cacheable.", "quote": "A 308 response is heuristically cacheable; i.e., unless otherwise", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "308 is younger than 301 and may not be recognized everywhere.", "quote": "This status code is much younger (June 2014) than its", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "History: 301/302 were originally method-preserving but practice converged on GET; 307 and 308 were added to unambiguously indicate method-preserving redirects.", "quote": "307 (Temporary Redirect) and 308 (Permanent Redirect) [RFC7538] were later added to unambiguously indicate method-preserving redirects, and status codes 301 and 302 have been adjusted to allow a POST request to be redirected as GET.", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "When following a redirect the client resends the original request, changing the method per the status code's semantics, and strips content headers if the method became GET/HEAD.", "quote": "If the request method has been changed to GET or HEAD, remove", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "RFC 9110 obsoletes RFC 7538 (the original 308 spec) and RFC 7231.", "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": "RFC 7538 defines 308 as like 301 except that it forbids changing POST to GET.", "quote": "This status code is similar to 301 (Moved Permanently)", "url": "https://www.rfc-editor.org/rfc/rfc7538.html"},
{"claim": "RFC 7538 originally said 308 is cacheable by default.", "quote": "A 308 response is cacheable by default; i.e., unless otherwise", "url": "https://www.rfc-editor.org/rfc/rfc7538.html"},
{"claim": "RFC 7538 warns that unknown 3xx codes are treated like 300, so 308 should be used only when clients are trusted to understand it.", "quote": "Therefore, the use of status code 308 is restricted to cases where", "url": "https://www.rfc-editor.org/rfc/rfc7538.html"}
]}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.