pub struct ArmSpec {
pub engine: ArmEngine,
pub model: Option<String>,
}Expand description
A fully-specified arm: which engine, on which backbone.
The backbone lives here rather than once per report because the interesting experiments need the two arms to differ on it:
- same-backbone (
native@gpt-5.5vscodex@gpt-5.5) — the harness delta, the original claim; - cross-tier diagonal (
native@gpt-5.4vscodex@gpt-5.5) — what the runtime is worth in model tiers, which is the economically legible claim (seedocs/proposals/coder-ab-value-surface.md); - ablation (
native@gpt-5.5vsnative@gpt-5.5with a mechanism off) — isolates one mechanism, which a CAR-vs-Codex comparison can never do since it confounds the harness with everything else about Codex.
The old shape (an Arm enum plus one report-level backbone) could express
only the first, and even then it did not enforce it: the pin reached the
native loop alone, so the external arm silently ran on its CLI’s configured
default. model here is threaded to whichever engine runs, so the invariant
is now the runtime’s job, not the operator’s memory.
Fields§
§engine: ArmEngine§model: Option<String>The pinned backbone. None = the engine’s own default (adaptive routing
for native; the CLI’s config for external) — unpinned, so a same-backbone
claim is unverifiable.
Implementations§
Source§impl ArmSpec
impl ArmSpec
Sourcepub fn external(id: impl Into<String>, model: Option<String>) -> Self
pub fn external(id: impl Into<String>, model: Option<String>) -> Self
An external CLI (codex) on model.
Sourcepub fn label(&self) -> String
pub fn label(&self) -> String
Report label: native@gpt-5.4, codex@gpt-5.5, or bare native when
unpinned. Two arms in one run can share an engine (ablation) or a model
(the harness delta), so the label carries both to stay unambiguous.
Sourcepub fn slug(&self) -> String
pub fn slug(&self) -> String
Filename-safe label: native@openai_gpt-5.4_latest.
Model ids carry / and : — a path separator, and illegal in a Windows
filename — so the label must never be used as one directly. It was: the
A/B wrote <task>-<label>.log and silently lost every native
transcript (the / made it a path into a nonexistent dir), which are the
exact records ab_learnings proposals tell a human to go read.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for ArmSpec
impl<'de> Deserialize<'de> for ArmSpec
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for ArmSpec
impl StructuralPartialEq for ArmSpec
Auto Trait Implementations§
impl Freeze for ArmSpec
impl RefUnwindSafe for ArmSpec
impl Send for ArmSpec
impl Sync for ArmSpec
impl Unpin for ArmSpec
impl UnsafeUnpin for ArmSpec
impl UnwindSafe for ArmSpec
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
impl<S, T> Duplex<S> for Twhere
T: FromSample<S> + ToSample<S>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more