RunOpus 5.5repeat 2
Gated-execute on HTTP 301 vs 308
claude-opus-5-5__gated-execute__research-http-redirects__r2
Score
1.000
- Cost
- $0.227
- + $0.066 judging
- Latency
- 42.9s
- setup 0.0s, grading 4.6s
- Turns
- 12
- Tool calls
- 11
- Subagents
- 0
- Tokens in / out
- 89k / 4.4k
- 72,432 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.
- Every state change was reviewed: heldgated-execute.reviewedEvery call that changed the world had been allowed by a review before it ran, counted from the world’s own journal.
- Every decision was read: heldgated-execute.decisionsEvery review that ran to its end gave its decision through the schema; an unreadable one is a denial.
- Each call was shown the right tools: heldgated-execute.toolsThe executor was shown the task’s full toolset and each reviewer the read-only tools.
Phases
Drawn from the phase records: timing and cost per call, no tool calls or messages.
| Phase | Duration | Cost | Turns | Tools | Model |
|---|---|---|---|---|---|
| Execute | 42.9s | $0.227 | 12 | 11 | 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 gated-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. “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, E7. “When it follows a 308, it must keep the original method and body.”
- 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 E9. “RFC 9110 calls both 301 and 308 "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 E11, E6. “RFC 9110 replaces (obsoletes) RFC 7231 and RFC 7538.”
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"]
- opened by role
- {"primary":["rfc9110"],"superseded":["rfc7538"],"secondary":["mdn-status-308"]}
- displayed share
- {"rfc9110":0.0499,"rfc7538":0.782,"mdn-status-308":1}
- cited count
- 3
- verified count
- 3
- 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 target 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 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":"When following a 301, a user agent may change POST to GET; 308 should be used if that is undesired.","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 indicate method-preserving redirects without ambiguity.","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":"If a redirect changes the method to GET or HEAD, content-specific headers are removed, so the body is dropped.","quote":"If the request method has been changed to GET or HEAD, remove content-specific header fields, including (but not limited to) Content-Encoding, Content-Language, Content-Location, Content-Type, Content-Length, Digest, Last-Modified.","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"308 is like 301 except that it does not allow changing POST to GET.","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://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308","claim":"With 308, the client keeps the method and body unchanged in the redirected request.","quote":"The request method and the body will not be modified by the client in the redirected request.","verified":true,"document":"mdn-status-308"},{"url":"https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308","claim":"MDN says 301 requires the method and body to stay unchanged, which conflicts with RFC 9110 allowing POST to become GET.","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://www.rfc-editor.org/rfc/rfc9110.html","claim":"301 and 308 are both heuristically cacheable unless the method or explicit cache controls say otherwise.","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":"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/rfc9110.html","claim":"RFC 9110 is the current specification and obsoletes RFC 7231 and RFC 7538.","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/rfc9110.html","claim":"308 is newer and may not be recognized by every client.","quote":"This status code is much younger (June 2014) than its sibling codes and thus might not be recognized everywhere.","verified":true,"document":"rfc9110"}]
- judge unverified quotes
- 0
- judge verdicts
- [{"names":{"status":"met","support":["E1","E2"]},"method-preserved-308":{"status":"met","support":["E6","E7"]},"method-change-301":{"status":"met","support":["E3","E4"]},"cacheable":{"status":"met","support":["E9"]},"specifications":{"status":"met","support":["E11","E6"]}},{"names":{"status":"met","support":["E1","E2"]},"method-preserved-308":{"status":"met","support":["E6","E7"]},"method-change-301":{"status":"met","support":["E3","E4"]},"cacheable":{"status":"met","support":["E9"]},"specifications":{"status":"met","support":["E11","E6"]}},{"names":{"status":"met","support":["E1","E2"]},"method-preserved-308":{"status":"met","support":["E6","E7"]},"method-change-301":{"status":"met","support":["E3","E4"]},"cacheable":{"status":"met","support":["E9"]},"specifications":{"status":"met","support":["E11","E6"]}}]
- judge failures
- 0
- grounded weight share
- 1
Final answer
Both 301 and 308 mean the same thing: the resource has moved permanently. They differ in one way. When a client follows a 301, it is allowed to change a POST into a GET. When it follows a 308, it must keep the original method and body. Both are cacheable by default, and both are currently defined in RFC 9110.
What each means. RFC 9110 uses the same wording for both: 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" (301: §15.4.2, 308: §15.4.9, https://www.rfc-editor.org/rfc/rfc9110.html). For both, the server SHOULD send a Location header with the new URI, and the client MAY follow it automatically.
How the method and body are treated.
- 301: RFC 9110 says that "for historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request." If that is unwanted, it says to use 308 instead.
- Why: HTTP/1.0 originally defined 301 and 302 as keeping the method. Early clients disagreed on whether to resend POST as POST or as GET, and in practice they settled on GET. So 307 and 308 were added "to unambiguously indicate method-preserving redirects," and the text for 301 and 302 was changed to allow POST to become GET.
- The general redirect rule: a client following a redirect SHOULD resend the original request. It changes the method only if the status code's rules allow it. If the method becomes GET or HEAD, it removes content-related headers such as Content-Type and Content-Length, which means the body is dropped.
- 308: it is the method-preserving version of 301. RFC 7538, which introduced it, says it "does not allow changing the request method from POST to GET" (https://www.rfc-editor.org/rfc/rfc7538.html).
- In practice: following a 301, a POST may arrive as a GET with no body. Following a 308, the same method and body are resent to the new URI. MDN says "The request method and the body will not be modified by the client in the redirected request" (https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308).
The sources disagree on 301. The same MDN page says that "A 301 Moved Permanently requires the request method and the body to remain unchanged," and treats switching to GET as something older clients get wrong. That conflicts with RFC 9110, which explicitly allows POST to become GET. The RFC is the normative text, so I've followed it. Elsewhere, the same MDN page describes 301 as a code "that may modify the request method when it is not a GET," which matches the RFC.
Caching. RFC 9110 calls both 301 and 308 "heuristically cacheable", unless the method definition or explicit cache controls say otherwise. RFC 7538 had described 308 as "cacheable by default."
Where each is specified.
- 301: RFC 9110 §15.4.2.
- 308: RFC 9110 §15.4.9.
- Older documents: RFC 9110 replaces (obsoletes) RFC 7231 and RFC 7538. RFC 7538 had itself replaced the experimental RFC 7238 without technical changes.
- Deployment caveat: RFC 9110 notes that 308 is "much younger (June 2014)" than the other redirect codes and "might not be recognized everywhere." RFC 7538 warns that a client that doesn't recognize 308 treats it like 300 (Multiple Choices), so automatic redirection isn't guaranteed.
{"evidence": [
{"claim": "301 means the target 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 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": "When following a 301, a user agent may change POST to GET; 308 should be used if that is undesired.", "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 indicate method-preserving redirects without ambiguity.", "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": "If a redirect changes the method to GET or HEAD, content-specific headers are removed, so the body is dropped.", "quote": "If the request method has been changed to GET or HEAD, remove content-specific header fields, including (but not limited to) Content-Encoding, Content-Language, Content-Location, Content-Type, Content-Length, Digest, Last-Modified.", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "308 is like 301 except that it does not allow changing POST to GET.", "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": "With 308, the client keeps the method and body unchanged in the redirected request.", "quote": "The request method and the body will not be modified by the client in the redirected request.", "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/308"},
{"claim": "MDN says 301 requires the method and body to stay unchanged, which conflicts with RFC 9110 allowing POST to become GET.", "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": "301 and 308 are both heuristically cacheable unless the method or explicit cache controls say otherwise.", "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": "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 9110 is the current specification and obsoletes RFC 7231 and RFC 7538.", "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": "308 is newer and may not be recognized by every client.", "quote": "This status code is much younger (June 2014) than its sibling codes and thus might not be recognized everywhere.", "url": "https://www.rfc-editor.org/rfc/rfc9110.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.