ScaffoldBench

RunSonnet 5.5repeat 1

Gated-execute on HTTP 301 vs 308

claude-sonnet-5-5__gated-execute__research-http-redirects__r1

Score

1.000

passed
design ran as designed
Cost
$0.086
+ $0.071 judging
Latency
25.8s
setup 0.0s, grading 4.9s
Turns
8
Tool calls
7
Subagents
0
Tokens in / out
53k / 3.1k
39,963 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.
  • 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

Execute: 0.0s to 25.8s, finished, 7 tool calls, $0.086

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

PhaseDurationCostTurnsToolsModel
Execute25.8s$0.08687claude-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

Record this cell yourself: npm run bench -- run --strategies gated-execute --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. “301 (Moved Permanently) and 308 (Permanent Redirect) both say the target resource has 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. “A client that follows it should repeat the same method and body at 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, E6. “"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 heuristically cacheable. That means they can be cached 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, E1, E4. “Both are currently defined in RFC 9110 (HTTP Semantics, 2022): 301 in section 15.4.2 and 308 in section 15.4.9.”

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.0261,"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
11
verified quote count
11
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; 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":"With 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 request method from POST to GET for the subsequent request.","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 indicated by the method definition or explicit cache controls (see","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"308 means the target resource has a new permanent URI","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 indicated by the method definition or explicit cache controls (see","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"308 is like 301 but does not allow changing the method from 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://www.rfc-editor.org/rfc/rfc7538.html","claim":"RFC 7538 originally 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","verified":true,"document":"rfc7538"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"308 may not be recognized everywhere; unknown 3xx codes are treated like 300","quote":"Section 6 of [RFC7231] requires recipients to treat unknown 3xx status codes the same way as status code 300 (Multiple Choices)","verified":true,"document":"rfc7538"},{"url":"https://www.rfc-editor.org/rfc/rfc9110.html","claim":"RFC 9110 obsoletes RFC 7538 (and 7231), so it is the current specification for both codes","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":"307, the temporary counterpart, forbids changing the method","quote":"the user agent MUST NOT change the request method if it performs an automatic redirection to that URI","verified":true,"document":"rfc9110"},{"url":"https://www.rfc-editor.org/rfc/rfc7538.html","claim":"RFC 7538 added 308 as the missing permanent variant of 307 and obsoleted experimental RFC 7238","quote":"This specification contains no technical changes from the Experimental RFC 7238, which it obsoletes.","verified":true,"document":"rfc7538"}]
judge unverified quotes
0
judge verdicts
[{"names":{"status":"met","support":["E1","E4"]},"method-preserved-308":{"status":"met","support":["E6"]},"method-change-301":{"status":"met","support":["E2","E6"]},"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":["E6"]},"method-change-301":{"status":"met","support":["E2"]},"cacheable":{"status":"met","support":["E3","E5"]},"specifications":{"status":"met","support":["E9"]}},{"names":{"status":"met","support":["E1","E4"]},"method-preserved-308":{"status":"met","support":["E6"]},"method-change-301":{"status":"met","support":["E2","E6"]},"cacheable":{"status":"met","support":["E3","E5"]},"specifications":{"status":"met","support":["E9","E6"]}}]
judge failures
0
grounded weight share
1

Final answer

I've read the 301 and 308 sections of RFC 9110 and the original RFC 7538. RFC 9110's header says it obsoletes RFC 7538, so I'm writing up the answer now.

What they mean. 301 (Moved Permanently) and 308 (Permanent Redirect) both say the target resource has a new permanent URI. Future references should use the new URI, which the server gives in the Location header. The two differ in how they treat the request method.

Method and body handling.

  • 301: RFC 9110 says that "For historical reasons, a user agent MAY change the request method from POST to GET for the subsequent request." In practice, many clients turn a redirected POST into a GET and drop the body. Servers can't count on the method being preserved.
  • 308: The method must not change from POST to GET. RFC 7538 calls it similar to 301, "except that it does not allow changing the request method from POST to GET." A client that follows it should repeat the same method and body at the new URI. This is the point of the code: it is the permanent counterpart of 307, which RFC 9110 says the user agent MUST NOT change the method for. RFC 9110 points to 308 as the fix when the POST-to-GET behavior of 301 is unwanted.
  • The RFC text I read doesn't spell out body handling in detail. Resending the body follows from keeping the method, but that is my inference rather than a quoted rule.

Cacheability. Both are heuristically cacheable. That means they can be cached unless the method definition or explicit cache controls say otherwise. RFC 9110 says this about each code. The older RFC 7538 said 308 was "cacheable by default", which is the earlier wording for the same idea.

Where each is specified.

  • Both are currently defined in RFC 9110 (HTTP Semantics, 2022): 301 in section 15.4.2 and 308 in section 15.4.9. RFC 9110 obsoletes RFC 7231, which defined 301 before it, and RFC 7538, which first defined 308 as a standards-track document in 2015.
  • RFC 7538 itself obsoleted the experimental RFC 7238.

Deployment caveat. 308 is much newer than 301 (June 2014 versus the original HTTP specs). RFC 9110 warns that it "might not be recognized everywhere". RFC 7538 adds that recipients treat unknown 3xx codes like 300 (Multiple Choices), so a client that doesn't know 308 may not redirect automatically. Servers should use 308 only when they trust the client to understand it, or when falling back to 300 behavior is acceptable.

Sources and conflicts. I didn't find any conflict between these sources. The only difference is the cacheability wording, which changed between RFC 7538 and RFC 9110. I tried to open the rfc-editor.org info page for RFC 7538 and got a 404. The obsoletion claim rests on RFC 9110's own header.

{"evidence": [
{"claim": "301 means the target resource has a new permanent URI; 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": "With 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 request method from POST to GET for the subsequent request.", "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 indicated by the method definition or explicit cache controls (see", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "308 means the target resource has a new permanent URI", "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 indicated by the method definition or explicit cache controls (see", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "308 is like 301 but does not allow changing the method from 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": "RFC 7538 originally 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", "url": "https://www.rfc-editor.org/rfc/rfc7538.html"},
{"claim": "308 may not be recognized everywhere; unknown 3xx codes are treated like 300", "quote": "Section 6 of [RFC7231] requires recipients to treat unknown 3xx status codes the same way as status code 300 (Multiple Choices)", "url": "https://www.rfc-editor.org/rfc/rfc7538.html"},
{"claim": "RFC 9110 obsoletes RFC 7538 (and 7231), so it is the current specification for both codes", "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": "307, the temporary counterpart, forbids changing the method", "quote": "the user agent MUST NOT change the request method if it performs an automatic redirection to that URI", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"claim": "RFC 7538 added 308 as the missing permanent variant of 307 and obsoleted 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"}
]}

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.