RunOpus 5.5repeat 2
Plan-execute on HTTP 301 vs 308
claude-opus-5-5__plan-execute__research-http-redirects__r2
Score
1.000
- Cost
- $0.408
- + $0.071 judging
- Latency
- 1m 10s
- setup 0.0s, grading 4.4s
- Turns
- 19
- Tool calls
- 16
- Subagents
- 0
- Tokens in / out
- 131k / 7.4k
- 98,018 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.
- The plan was a plan: heldplan-execute.planThe planner’s reply was read through its schema and held at least one step.
- Each call was shown the right tools: heldplan-execute.toolsThe planner was shown no tools and the executor the task’s full toolset.
Phases
Drawn from the phase records: timing and cost per call, no tool calls or messages.
| Phase | Duration | Cost | Turns | Tools | Model |
|---|---|---|---|---|---|
| Plan | 22.5s | $0.061 | 2 | 0 | claude-opus-5-5 |
| Execute | 47.8s | $0.347 | 17 | 16 | claude-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
- 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 plan-execute --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. “RFC 9110 defines 301 as meaning "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"”
- 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. “The client must resend the same method and the same body 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 E3, E4. “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 E7, E8. “RFC 9110 calls both codes "heuristically cacheable" and lists 301 and 308 among them”
- 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 E10, E11. “RFC 9110 in turn obsoletes RFC 7538”
Penalties
No penalties were applied.
Scorer metadata
- corpus
- {"version":2,"snapshot":"2026-10-01","hash":"25fbed79c4f7f9e1b850436e0e4872f8e25dd80142f3177231c456f21817b817","documents":8}
- opened documents
- ["rfc9110","rfc9111","rfc7538","mdn-status-308","mdn-status-301"]
- opened by role
- {"primary":["rfc9110"],"secondary":["rfc9111","mdn-status-308","mdn-status-301"],"superseded":["rfc7538"]}
- displayed share
- {"rfc9110":0.0758,"rfc9111":0.1073,"rfc7538":0.782,"mdn-status-308":1,"mdn-status-301":1}
- cited count
- 5
- verified count
- 5
- hallucinated count
- 0
- citation integrity
- 1
- hallucinated urls
- []
- evidence block
- true
- evidence block repaired
- false
- evidence count
- 13
- verified quote count
- 13
- verified quote rate
- 1
- evidence
- [{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"301 means the resource has a new permanent URI that future references should use.","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.","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 historical reasons, a client following a 301 may change POST to GET.","quote":"For historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request.","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"307 and 308 were added to mark method-preserving redirects, and 301/302 were adjusted to allow POST to become GET.","quote":"Prevailing practice eventually converged on changing the method to GET.","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"When following a redirect, the client changes the method only if the status code's meaning allows it.","quote":"Change the request method according to the redirecting status code's semantics, if applicable.","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"308 is like 301 except that changing POST to GET is not allowed.","quote":"Note: 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/rfc9110.html","claim":"A 301 response is heuristically cacheable.","quote":"A 301 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/rfc9110.html","claim":"A 308 response is heuristically cacheable.","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/rfc9111.html","claim":"\"Heuristically cacheable\" is the newer name for \"cacheable by default\".","quote":"Note that in previous specifications, heuristically cacheable response status codes were called \"cacheable by default\".","verified":true,"document":"rfc9111"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"RFC 9110 obsoletes RFC 7538 (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 replaced the Experimental RFC 7238 without technical changes.","quote":"This specification contains no technical changes from the Experimental RFC 7238, which it obsoletes.","verified":true,"document":"rfc7538"},{"url":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301","claim":"MDN says browsers following the Fetch Standard switch POST to GET after a 301, and that changing the method after a 308 is prohibited.","quote":"To avoid user agents modifying the request, use 308 Permanent Redirect instead, as altering the method after a 308 response is prohibited.","verified":true,"document":"mdn-status-301"},{"url":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/308","claim":"MDN's 308 page says 301 requires the method to stay the same, 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"}]
- 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","E4"]},"cacheable":{"status":"met","support":["E7","E8"]},"specifications":{"status":"met","support":["E10","E11"]}},{"names":{"status":"met","support":["E1","E2"]},"method-preserved-308":{"status":"met","support":["E6"]},"method-change-301":{"status":"met","support":["E3","E4"]},"cacheable":{"status":"met","support":["E7","E8"]},"specifications":{"status":"met","support":["E10","E11"]}},{"names":{"status":"met","support":["E1","E2"]},"method-preserved-308":{"status":"met","support":["E6"]},"method-change-301":{"status":"met","support":["E3","E4"]},"cacheable":{"status":"met","support":["E7","E8"]},"specifications":{"status":"met","support":["E10","E11"]}}]
- judge failures
- 0
- grounded weight share
- 1
Final answer
301 and 308 mean the same thing: the resource has moved permanently to a new URL. Both are cacheable by default, and both are now defined in RFC 9110. The only difference is that after a 301, a client may turn a POST into a GET, and after a 308 it must resend the original method and body.
What each means. RFC 9110 defines 301 as meaning "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" (https://www.rfc-editor.org/rfc/rfc9110.html). The 308 section uses exactly the same definition. In both cases 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).
Method and body.
301: The spec lets a client switch from POST to GET: "For historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request." It also says 308 can be used if that isn't wanted (https://www.rfc-editor.org/rfc/rfc9110.html).
- Why: HTTP/1.0 originally defined 301 and 302 as keeping the method. Browsers didn't agree on this, and common practice settled on switching to GET. 307 and 308 were then "added to unambiguously indicate method-preserving redirects" (https://www.rfc-editor.org/rfc/rfc9110.html).
- The body: when following a redirect, the client changes the method only if the status code's meaning allows it. If the method becomes GET or HEAD, the client removes the content-specific headers such as Content-Type and Content-Length. In practice, the body is dropped (https://www.rfc-editor.org/rfc/rfc9110.html).
- The switch only applies to POST. Other methods are resent as they were.
- 308: The client must resend the same method and the same body to the new URI. RFC 7538, the RFC that originally defined 308, says it "is similar to 301 (Moved Permanently) ... except that it does not allow changing the request method from POST to GET" (https://www.rfc-editor.org/rfc/rfc7538.html). RFC 9110's own 308 section doesn't repeat that sentence. It gets the same result through the method-preserving note above and its comment under 301 that 308 is the alternative.
- Browsers in practice: MDN says that under the Fetch Standard, a browser that gets a 301 in response to a POST uses GET for the next request. It adds that changing the method after a 308 is not allowed (https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301).
Where the sources disagree. MDN's 308 page says that a 301 "requires the request method and the body to remain unchanged" and that older clients handle this "incorrectly" by switching to GET (https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/308). That conflicts with RFC 9110, which explicitly allows the switch, and with MDN's own 301 page, which calls it "permitted by the HTTP specification." The RFC is the authoritative source.
Caching. RFC 9110 calls both codes "heuristically cacheable" and lists 301 and 308 among them (https://www.rfc-editor.org/rfc/rfc9110.html). This means that if a response has no explicit expiry, a cache may guess a lifetime and reuse it. The method definition or explicit cache headers (Cache-Control or Expires) can override this (https://www.rfc-editor.org/rfc/rfc9111.html). RFC 9111 notes that older specifications called this "cacheable by default," which is the wording RFC 7538 used for 308 (https://www.rfc-editor.org/rfc/rfc7538.html).
Where each is specified.
- Current: RFC 9110, HTTP Semantics (June 2022). 301 is in §15.4.2 and 308 in §15.4.9 (https://www.rfc-editor.org/rfc/rfc9110.html).
- 301 history: RFC 9110 replaces RFC 7231, which previously held 301's definition (§6.4.2, as RFC 7538 cites it).
- 308 history: 308 was first published as the Experimental RFC 7238, which RFC 7538 (April 2015, Standards Track) replaced. RFC 9110 in turn obsoletes RFC 7538 (https://www.rfc-editor.org/rfc/rfc7538.html, https://www.rfc-editor.org/rfc/rfc9110.html).
- Compatibility: RFC 9110 notes that 308 is "much younger (June 2014)" than the other redirect codes and so might not be recognised everywhere.
{"evidence": [
{"claim": "301 means the resource has a new permanent URI that future references should use.", "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.", "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 historical reasons, a client following a 301 may change POST to GET.", "quote": "For historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request.", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "307 and 308 were added to mark method-preserving redirects, and 301/302 were adjusted to allow POST to become GET.", "quote": "Prevailing practice eventually converged on changing the method to GET.", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "When following a redirect, the client changes the method only if the status code's meaning allows it.", "quote": "Change the request method according to the redirecting status code's semantics, if applicable.", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "308 is like 301 except that changing POST to GET is not allowed.", "quote": "Note: 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": "A 301 response is heuristically cacheable.", "quote": "A 301 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": "A 308 response is heuristically cacheable.", "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": "\"Heuristically cacheable\" is the newer name for \"cacheable by default\".", "quote": "Note that in previous specifications, heuristically cacheable response status codes were called \"cacheable by default\".", "url": "https://www.rfc-editor.org/rfc/rfc9111.html"},
{"claim": "RFC 9110 obsoletes RFC 7538 (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 replaced the Experimental RFC 7238 without technical changes.", "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": "MDN says browsers following the Fetch Standard switch POST to GET after a 301, and that changing the method after a 308 is prohibited.", "quote": "To avoid user agents modifying the request, use 308 Permanent Redirect instead, as altering the method after a 308 response is prohibited.", "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301"},
{"claim": "MDN's 308 page says 301 requires the method to stay the same, 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/Status/308"}
]}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.