Skip to content
Merged
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8ac12c6
fix(ids): UUIDs are not strings — mint real ones, and stop typing ids…
joelteply Aug 13, 2026
b1014a3
docs(CLAUDE.md): headless Rust core is the system — Node is ONE clien…
joelteply Aug 13, 2026
ec1abb9
fix(cli): `uu` is the alias — `cu` is UUCP, and every harness default…
joelteply Aug 13, 2026
ec327b9
fix(core): the last Python in the runtime path — one vestigial, one s…
joelteply Aug 13, 2026
f92e0d9
feat(identity): PersonaRef vs PeerId — a reference is not an identity…
joelteply Aug 13, 2026
a36722f
refactor(memory): the memory layer takes PersonaRef, not loose text —…
joelteply Aug 13, 2026
672c32c
refactor(commands): persona params carry PersonaRef — agent/solve, pe…
joelteply Aug 13, 2026
6db0a74
refactor(rag/introspect): last persona PARAMS typed — and the RAG sou…
joelteply Aug 13, 2026
4fccf5a
fix(test): 5 supervisor tests have been panicking since #398 slice 3 …
joelteply Aug 13, 2026
31d8a5d
fix(test): pin the stub's REFUSAL contract — the old test asserted th…
joelteply Aug 13, 2026
b496ed1
test(identity): CI guard — a String-typed identity field must be DECL…
joelteply Aug 13, 2026
7e0c546
fix(cli): `continuum start` execs the installed server — building is …
joelteply Aug 13, 2026
f964dda
fix(core): tree is GREEN again — 7081/0 (peer_id → PeerId finished, g…
joelteply Aug 13, 2026
29990b7
fix(tests): a subsystem-named room does not belong in a fixture either
joelteply Aug 13, 2026
e0ac271
fix(benchmark): an UNGRADEABLE grade is an ABSENCE, not a capability …
joelteply Aug 13, 2026
d1b2440
fix(swe): gold-gate the harness — refuse an env whose pytest cannot R…
joelteply Aug 13, 2026
ffdb783
docs(arch): benchmarks are ADAPTERS into recipes/activities — never a…
joelteply Aug 13, 2026
9fa02eb
feat(activity): a room's recipe binding finally has a READER — every …
joelteply Aug 13, 2026
1575f56
fix(activity): the purpose index must SAY it ran — a silent fold is i…
joelteply Aug 13, 2026
c254ac9
feat(persona): RAG is a RenderTarget — one ViewState renders to eyes …
joelteply Aug 13, 2026
11e186d
docs(persona): name the substrate prerequisite IN the module, before …
joelteply Aug 13, 2026
713d931
feat(positron): per-ROOM substrates — the keystone that lets a citize…
joelteply Aug 13, 2026
7a2d165
feat(positron): the chat projection writes per-ROOM as well as node —…
joelteply Aug 13, 2026
a4c75c7
feat(persona): a citizen reads WHO IS PRESENT from the same projectio…
joelteply Aug 13, 2026
e85541f
fix(cli): restore the deploy path — reboot builds again, and the sock…
joelteply Aug 13, 2026
fa1f720
fix(deploy): publish the verified core binary to the installed path e…
joelteply Aug 13, 2026
472b866
fix(persona): one contract, one spelling — a ViewState states its flo…
joelteply Aug 13, 2026
40ce719
glass-box(persona): say WHAT the rejected event was, not just which b…
joelteply Aug 13, 2026
9e2389f
merge: canary into fix/room-purpose-reads-the-recipe-binding
joelteply Aug 20, 2026
f3ae4f7
feat(serving): a throughput baseline carries the WINDOW it was measur…
joelteply Aug 20, 2026
a2b4d0b
fix: restore 33 core files to canary's version — repair my bad #2282 …
joelteply Aug 20, 2026
552d06d
fix: restore 4 ts-rs generated bindings corrupted by the union merge
joelteply Aug 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions core/continuum-core/src/inference/throughput_expectation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,55 @@ pub struct ThroughputBaseline {
pub accelerator: &'static str,
pub expected_tok_s: f64,
pub source: &'static str,
/// The SERVED WINDOW this rate was measured at, in tokens.
///
/// Load-bearing, and its absence was a live mis-attribution (measured
/// 2026-08-20, Qwen3.8-27B on this M5): the catalog carried 17.2 tok/s
/// taken at a 19,712 window, the live lane was serving at 89,280 — 4.5×
/// the KV to walk per decoded token on UMA — and three samples came in at
/// 2.7/6.2/7.8 tok/s. The collapse alarm's own text names CPU fallback,
/// pager thrash and GPU contention as the suspects, so a reader would
/// have gone hunting a defect that was not there. Decode rate is a
/// function of KV size; a rate without its window is not a comparable
/// quantity, and the struct already refuses to "present an unsourced
/// baseline as fact" — an unwindowed one is the same class.
///
/// `None` means the window was genuinely not recorded when the number was
/// taken. That is an honest absence, NOT a zero: consumers must treat it
/// as "no like-for-like comparison available" rather than silently
/// assuming the live window matches ([[unknown-is-not-a-quantity]]).
pub measured_at_window: Option<u32>,
}

/// How far apart two served windows must be before a throughput comparison
/// between them stops being like-for-like.
///
/// Decode cost per token grows with resident KV, so the same lane legitimately
/// reads slower at a larger window with NOTHING wrong. 2× is deliberately
/// coarse — same order of magnitude is still a fair comparison, and this gate
/// exists to suppress mis-attribution, not to excuse real collapse.
const WINDOW_COMPARABILITY_FACTOR: f64 = 2.0;

impl ThroughputBaseline {
/// Whether this baseline can be fairly compared against a lane serving
/// `live_window` tokens.
///
/// `false` does NOT mean "healthy" — it means this baseline cannot say.
/// A caller that still wants to alarm must say out loud that the
/// expectation was taken at a different window, or it will send a reader
/// hunting the wrong cause.
pub fn comparable_at(&self, live_window: u32) -> bool {
let Some(measured) = self.measured_at_window else {
// Never recorded → no basis to claim comparability either way.
return false;
};
if measured == 0 || live_window == 0 {
return false;
}
let (a, b) = (measured as f64, live_window as f64);
let spread = if a > b { a / b } else { b / a };
spread <= WINDOW_COMPARABILITY_FACTOR
}
}

/// How measured decode throughput compares to the expected baseline. `ratio`
Expand Down Expand Up @@ -151,6 +200,10 @@ pub const SEED_BASELINES: &[ThroughputBaseline] = &[
accelerator: "apple-m5",
expected_tok_s: 67.8,
source: "MEASURED: continuum tests/llamacpp_metal_throughput.rs single-seq, 2026-06",
// Window not recorded when this number was taken (pre-#440). Honest
// absence: consumers get `comparable_at() == false` rather than a
// silent assumption that the live lane matches.
measured_at_window: None,
},
ThroughputBaseline {
model: "qwen3-8b",
Expand All @@ -161,6 +214,10 @@ pub const SEED_BASELINES: &[ThroughputBaseline] = &[
// prompt-eval was ~960 tok/s. This anchors the 4B estimate below.
expected_tok_s: 221.7,
source: "MEASURED: DMR llama.cpp-cuda slot timing, RTX 5090 32GB, 2026-06-15",
// Window not recorded when this number was taken (pre-#440). Honest
// absence: consumers get `comparable_at() == false` rather than a
// silent assumption that the live lane matches.
measured_at_window: None,
},
ThroughputBaseline {
model: "qwen3.5-4b",
Expand All @@ -173,6 +230,10 @@ pub const SEED_BASELINES: &[ThroughputBaseline] = &[
// fallen-off-GPU regression worth screaming about.
expected_tok_s: 180.0,
source: "ESTIMATE: conservative floor (8B measured 221.7 same GPU); REFINE with a 4B run",
// Window not recorded when this number was taken (pre-#440). Honest
// absence: consumers get `comparable_at() == false` rather than a
// silent assumption that the live lane matches.
measured_at_window: None,
},
];

Expand Down
Loading