Skip to content
Draft
Changes from all commits
Commits
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
37 changes: 31 additions & 6 deletions docs/11-gateway.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -368,12 +368,37 @@ in-process, not a product surface. The gateway is stateless apart from cache
- **M11.6** Exact cache + circuit breakers; p99 overhead budget: <3ms non-streaming, <1ms per stream frame at 100 rps on one core. ✅ *(shipped: `panday_gateway::cache`, `panday_gateway::circuit`, wired in `Gateway::chat`; `tests/cache_and_breakers.rs`, `tests/overhead.rs`.)*

**Measured, release build, single-threaded runtime, 1000 back-to-back requests
(harder than the specified 100 rps — no idle time between them):**
establishment p50 21.6µs / p99 52.0µs against the 3ms budget; per stream frame
p50 41ns / p99 1.17µs against the 1ms budget. The benchmark is `#[ignore]`d
because a wall-clock assertion on shared CI hardware fails for reasons
unrelated to the code, and a flaky test gets muted — which is worse than one
that must be run deliberately.
(harder than the specified 100 rps — no idle time between them).** The
benchmark is `#[ignore]`d because a wall-clock assertion on shared CI hardware
fails for reasons unrelated to the code, and a flaky test gets muted — which is
worse than one that must be run deliberately.

| | 2026-08-20 | 2026-08-24 | budget |
|---|---|---|---|
| establishment p50 | 21.6µs | 49.6µs | — |
| establishment p99 | 52.0µs | 99.1µs | 3ms |
| per stream frame p50 | 41ns | 167ns | — |
| per stream frame p99 | 1.17µs | 2.21µs | 1ms |

**The budget holds with roughly thirty times the headroom, and the figures
doubled.** Both are true and the second is not dismissed by the first: a number
that moves 2x is worth noticing while the margin is large, because that is the
only time it is cheap to.

**What the doubling cannot be attributed to, honestly.** Two things changed
between the runs and this measurement cannot separate them. The gateway gained
real work on the establishment path — `ExactCache` became async with a bounded
lookup (M11.10), per-route TTL resolution (M11.11), and the classifier's
confidence now rides to the audit (M12.5 groundwork). And the host was not
quiet: load average ~4 with another application at ~68% of a core, where the
2026-08-20 figures came from an idle machine. Attributing the change to either
would be inventing a cause, so both are named and neither is chosen. A clean
re-measurement on an idle host is what would settle it, and it has not been
done.

The older figures are kept rather than overwritten. A single number in a doc
reads as "this is what it is"; two dated ones read as "this is how it moves",
which is the more useful thing to know about a budget with this much room.

**The exact cache is not Postgres yet.** The spec names a PG unlogged table and
**no milestone owns building one** — this previously cited "M3.5", which is
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
docs(11): re-measure the overhead budget, and keep both readings by codeitlikemiley · Pull Request #43 · codeitlikemiley/panday · GitHub
Skip to content
Draft
Changes from all commits
Commits
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
37 changes: 31 additions & 6 deletions docs/11-gateway.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -368,12 +368,37 @@ in-process, not a product surface. The gateway is stateless apart from cache
- **M11.6** Exact cache + circuit breakers; p99 overhead budget: <3ms non-streaming, <1ms per stream frame at 100 rps on one core. ✅ *(shipped: `panday_gateway::cache`, `panday_gateway::circuit`, wired in `Gateway::chat`; `tests/cache_and_breakers.rs`, `tests/overhead.rs`.)*

**Measured, release build, single-threaded runtime, 1000 back-to-back requests
(harder than the specified 100 rps — no idle time between them):**
establishment p50 21.6µs / p99 52.0µs against the 3ms budget; per stream frame
p50 41ns / p99 1.17µs against the 1ms budget. The benchmark is `#[ignore]`d
because a wall-clock assertion on shared CI hardware fails for reasons
unrelated to the code, and a flaky test gets muted — which is worse than one
that must be run deliberately.
(harder than the specified 100 rps — no idle time between them).** The
benchmark is `#[ignore]`d because a wall-clock assertion on shared CI hardware
fails for reasons unrelated to the code, and a flaky test gets muted — which is
worse than one that must be run deliberately.

| | 2026-08-20 | 2026-08-24 | budget |
|---|---|---|---|
| establishment p50 | 21.6µs | 49.6µs | — |
| establishment p99 | 52.0µs | 99.1µs | 3ms |
| per stream frame p50 | 41ns | 167ns | — |
| per stream frame p99 | 1.17µs | 2.21µs | 1ms |

**The budget holds with roughly thirty times the headroom, and the figures
doubled.** Both are true and the second is not dismissed by the first: a number
that moves 2x is worth noticing while the margin is large, because that is the
only time it is cheap to.

**What the doubling cannot be attributed to, honestly.** Two things changed
between the runs and this measurement cannot separate them. The gateway gained
real work on the establishment path — `ExactCache` became async with a bounded
lookup (M11.10), per-route TTL resolution (M11.11), and the classifier's
confidence now rides to the audit (M12.5 groundwork). And the host was not
quiet: load average ~4 with another application at ~68% of a core, where the
2026-08-20 figures came from an idle machine. Attributing the change to either
would be inventing a cause, so both are named and neither is chosen. A clean
re-measurement on an idle host is what would settle it, and it has not been
done.

The older figures are kept rather than overwritten. A single number in a doc
reads as "this is what it is"; two dated ones read as "this is how it moves",
which is the more useful thing to know about a budget with this much room.

**The exact cache is not Postgres yet.** The spec names a PG unlogged table and
**no milestone owns building one** — this previously cited "M3.5", which is
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(11): re-measure the overhead budget, and keep both readings by codeitlikemiley · Pull Request #43 · codeitlikemiley/panday · GitHub
Skip to content
Draft
Changes from all commits
Commits
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
37 changes: 31 additions & 6 deletions docs/11-gateway.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -368,12 +368,37 @@ in-process, not a product surface. The gateway is stateless apart from cache
- **M11.6** Exact cache + circuit breakers; p99 overhead budget: <3ms non-streaming, <1ms per stream frame at 100 rps on one core. ✅ *(shipped: `panday_gateway::cache`, `panday_gateway::circuit`, wired in `Gateway::chat`; `tests/cache_and_breakers.rs`, `tests/overhead.rs`.)*

**Measured, release build, single-threaded runtime, 1000 back-to-back requests
(harder than the specified 100 rps — no idle time between them):**
establishment p50 21.6µs / p99 52.0µs against the 3ms budget; per stream frame
p50 41ns / p99 1.17µs against the 1ms budget. The benchmark is `#[ignore]`d
because a wall-clock assertion on shared CI hardware fails for reasons
unrelated to the code, and a flaky test gets muted — which is worse than one
that must be run deliberately.
(harder than the specified 100 rps — no idle time between them).** The
benchmark is `#[ignore]`d because a wall-clock assertion on shared CI hardware
fails for reasons unrelated to the code, and a flaky test gets muted — which is
worse than one that must be run deliberately.

| | 2026-08-20 | 2026-08-24 | budget |
|---|---|---|---|
| establishment p50 | 21.6µs | 49.6µs | — |
| establishment p99 | 52.0µs | 99.1µs | 3ms |
| per stream frame p50 | 41ns | 167ns | — |
| per stream frame p99 | 1.17µs | 2.21µs | 1ms |

**The budget holds with roughly thirty times the headroom, and the figures
doubled.** Both are true and the second is not dismissed by the first: a number
that moves 2x is worth noticing while the margin is large, because that is the
only time it is cheap to.

**What the doubling cannot be attributed to, honestly.** Two things changed
between the runs and this measurement cannot separate them. The gateway gained
real work on the establishment path — `ExactCache` became async with a bounded
lookup (M11.10), per-route TTL resolution (M11.11), and the classifier's
confidence now rides to the audit (M12.5 groundwork). And the host was not
quiet: load average ~4 with another application at ~68% of a core, where the
2026-08-20 figures came from an idle machine. Attributing the change to either
would be inventing a cause, so both are named and neither is chosen. A clean
re-measurement on an idle host is what would settle it, and it has not been
done.

The older figures are kept rather than overwritten. A single number in a doc
reads as "this is what it is"; two dated ones read as "this is how it moves",
which is the more useful thing to know about a budget with this much room.

**The exact cache is not Postgres yet.** The spec names a PG unlogged table and
**no milestone owns building one** — this previously cited "M3.5", which is
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(11): re-measure the overhead budget, and keep both readings by codeitlikemiley · Pull Request #43 · codeitlikemiley/panday · GitHub
Skip to content
Draft
Changes from all commits
Commits
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
37 changes: 31 additions & 6 deletions docs/11-gateway.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -368,12 +368,37 @@ in-process, not a product surface. The gateway is stateless apart from cache
- **M11.6** Exact cache + circuit breakers; p99 overhead budget: <3ms non-streaming, <1ms per stream frame at 100 rps on one core. ✅ *(shipped: `panday_gateway::cache`, `panday_gateway::circuit`, wired in `Gateway::chat`; `tests/cache_and_breakers.rs`, `tests/overhead.rs`.)*

**Measured, release build, single-threaded runtime, 1000 back-to-back requests
(harder than the specified 100 rps — no idle time between them):**
establishment p50 21.6µs / p99 52.0µs against the 3ms budget; per stream frame
p50 41ns / p99 1.17µs against the 1ms budget. The benchmark is `#[ignore]`d
because a wall-clock assertion on shared CI hardware fails for reasons
unrelated to the code, and a flaky test gets muted — which is worse than one
that must be run deliberately.
(harder than the specified 100 rps — no idle time between them).** The
benchmark is `#[ignore]`d because a wall-clock assertion on shared CI hardware
fails for reasons unrelated to the code, and a flaky test gets muted — which is
worse than one that must be run deliberately.

| | 2026-08-20 | 2026-08-24 | budget |
|---|---|---|---|
| establishment p50 | 21.6µs | 49.6µs | — |
| establishment p99 | 52.0µs | 99.1µs | 3ms |
| per stream frame p50 | 41ns | 167ns | — |
| per stream frame p99 | 1.17µs | 2.21µs | 1ms |

**The budget holds with roughly thirty times the headroom, and the figures
doubled.** Both are true and the second is not dismissed by the first: a number
that moves 2x is worth noticing while the margin is large, because that is the
only time it is cheap to.

**What the doubling cannot be attributed to, honestly.** Two things changed
between the runs and this measurement cannot separate them. The gateway gained
real work on the establishment path — `ExactCache` became async with a bounded
lookup (M11.10), per-route TTL resolution (M11.11), and the classifier's
confidence now rides to the audit (M12.5 groundwork). And the host was not
quiet: load average ~4 with another application at ~68% of a core, where the
2026-08-20 figures came from an idle machine. Attributing the change to either
would be inventing a cause, so both are named and neither is chosen. A clean
re-measurement on an idle host is what would settle it, and it has not been
done.

The older figures are kept rather than overwritten. A single number in a doc
reads as "this is what it is"; two dated ones read as "this is how it moves",
which is the more useful thing to know about a budget with this much room.

**The exact cache is not Postgres yet.** The spec names a PG unlogged table and
**no milestone owns building one** — this previously cited "M3.5", which is
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' docs(11): re-measure the overhead budget, and keep both readings by codeitlikemiley · Pull Request #43 · codeitlikemiley/panday · GitHub
Skip to content
Draft
Changes from all commits
Commits
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
37 changes: 31 additions & 6 deletions docs/11-gateway.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -368,12 +368,37 @@ in-process, not a product surface. The gateway is stateless apart from cache
- **M11.6** Exact cache + circuit breakers; p99 overhead budget: <3ms non-streaming, <1ms per stream frame at 100 rps on one core. ✅ *(shipped: `panday_gateway::cache`, `panday_gateway::circuit`, wired in `Gateway::chat`; `tests/cache_and_breakers.rs`, `tests/overhead.rs`.)*

**Measured, release build, single-threaded runtime, 1000 back-to-back requests
(harder than the specified 100 rps — no idle time between them):**
establishment p50 21.6µs / p99 52.0µs against the 3ms budget; per stream frame
p50 41ns / p99 1.17µs against the 1ms budget. The benchmark is `#[ignore]`d
because a wall-clock assertion on shared CI hardware fails for reasons
unrelated to the code, and a flaky test gets muted — which is worse than one
that must be run deliberately.
(harder than the specified 100 rps — no idle time between them).** The
benchmark is `#[ignore]`d because a wall-clock assertion on shared CI hardware
fails for reasons unrelated to the code, and a flaky test gets muted — which is
worse than one that must be run deliberately.

| | 2026-08-20 | 2026-08-24 | budget |
|---|---|---|---|
| establishment p50 | 21.6µs | 49.6µs | — |
| establishment p99 | 52.0µs | 99.1µs | 3ms |
| per stream frame p50 | 41ns | 167ns | — |
| per stream frame p99 | 1.17µs | 2.21µs | 1ms |

**The budget holds with roughly thirty times the headroom, and the figures
doubled.** Both are true and the second is not dismissed by the first: a number
that moves 2x is worth noticing while the margin is large, because that is the
only time it is cheap to.

**What the doubling cannot be attributed to, honestly.** Two things changed
between the runs and this measurement cannot separate them. The gateway gained
real work on the establishment path — `ExactCache` became async with a bounded
lookup (M11.10), per-route TTL resolution (M11.11), and the classifier's
confidence now rides to the audit (M12.5 groundwork). And the host was not
quiet: load average ~4 with another application at ~68% of a core, where the
2026-08-20 figures came from an idle machine. Attributing the change to either
would be inventing a cause, so both are named and neither is chosen. A clean
re-measurement on an idle host is what would settle it, and it has not been
done.

The older figures are kept rather than overwritten. A single number in a doc
reads as "this is what it is"; two dated ones read as "this is how it moves",
which is the more useful thing to know about a budget with this much room.

**The exact cache is not Postgres yet.** The spec names a PG unlogged table and
**no milestone owns building one** — this previously cited "M3.5", which is
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(11): re-measure the overhead budget, and keep both readings by codeitlikemiley · Pull Request #43 · codeitlikemiley/panday · GitHub
Skip to content
Draft
Changes from all commits
Commits
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
37 changes: 31 additions & 6 deletions docs/11-gateway.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -368,12 +368,37 @@ in-process, not a product surface. The gateway is stateless apart from cache
- **M11.6** Exact cache + circuit breakers; p99 overhead budget: <3ms non-streaming, <1ms per stream frame at 100 rps on one core. ✅ *(shipped: `panday_gateway::cache`, `panday_gateway::circuit`, wired in `Gateway::chat`; `tests/cache_and_breakers.rs`, `tests/overhead.rs`.)*

**Measured, release build, single-threaded runtime, 1000 back-to-back requests
(harder than the specified 100 rps — no idle time between them):**
establishment p50 21.6µs / p99 52.0µs against the 3ms budget; per stream frame
p50 41ns / p99 1.17µs against the 1ms budget. The benchmark is `#[ignore]`d
because a wall-clock assertion on shared CI hardware fails for reasons
unrelated to the code, and a flaky test gets muted — which is worse than one
that must be run deliberately.
(harder than the specified 100 rps — no idle time between them).** The
benchmark is `#[ignore]`d because a wall-clock assertion on shared CI hardware
fails for reasons unrelated to the code, and a flaky test gets muted — which is
worse than one that must be run deliberately.

| | 2026-08-20 | 2026-08-24 | budget |
|---|---|---|---|
| establishment p50 | 21.6µs | 49.6µs | — |
| establishment p99 | 52.0µs | 99.1µs | 3ms |
| per stream frame p50 | 41ns | 167ns | — |
| per stream frame p99 | 1.17µs | 2.21µs | 1ms |

**The budget holds with roughly thirty times the headroom, and the figures
doubled.** Both are true and the second is not dismissed by the first: a number
that moves 2x is worth noticing while the margin is large, because that is the
only time it is cheap to.

**What the doubling cannot be attributed to, honestly.** Two things changed
between the runs and this measurement cannot separate them. The gateway gained
real work on the establishment path — `ExactCache` became async with a bounded
lookup (M11.10), per-route TTL resolution (M11.11), and the classifier's
confidence now rides to the audit (M12.5 groundwork). And the host was not
quiet: load average ~4 with another application at ~68% of a core, where the
2026-08-20 figures came from an idle machine. Attributing the change to either
would be inventing a cause, so both are named and neither is chosen. A clean
re-measurement on an idle host is what would settle it, and it has not been
done.

The older figures are kept rather than overwritten. A single number in a doc
reads as "this is what it is"; two dated ones read as "this is how it moves",
which is the more useful thing to know about a budget with this much room.

**The exact cache is not Postgres yet.** The spec names a PG unlogged table and
**no milestone owns building one** — this previously cited "M3.5", which is
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(11): re-measure the overhead budget, and keep both readings by codeitlikemiley · Pull Request #43 · codeitlikemiley/panday · GitHub
Skip to content
Draft
Changes from all commits
Commits
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
37 changes: 31 additions & 6 deletions docs/11-gateway.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -368,12 +368,37 @@ in-process, not a product surface. The gateway is stateless apart from cache
- **M11.6** Exact cache + circuit breakers; p99 overhead budget: <3ms non-streaming, <1ms per stream frame at 100 rps on one core. ✅ *(shipped: `panday_gateway::cache`, `panday_gateway::circuit`, wired in `Gateway::chat`; `tests/cache_and_breakers.rs`, `tests/overhead.rs`.)*

**Measured, release build, single-threaded runtime, 1000 back-to-back requests
(harder than the specified 100 rps — no idle time between them):**
establishment p50 21.6µs / p99 52.0µs against the 3ms budget; per stream frame
p50 41ns / p99 1.17µs against the 1ms budget. The benchmark is `#[ignore]`d
because a wall-clock assertion on shared CI hardware fails for reasons
unrelated to the code, and a flaky test gets muted — which is worse than one
that must be run deliberately.
(harder than the specified 100 rps — no idle time between them).** The
benchmark is `#[ignore]`d because a wall-clock assertion on shared CI hardware
fails for reasons unrelated to the code, and a flaky test gets muted — which is
worse than one that must be run deliberately.

| | 2026-08-20 | 2026-08-24 | budget |
|---|---|---|---|
| establishment p50 | 21.6µs | 49.6µs | — |
| establishment p99 | 52.0µs | 99.1µs | 3ms |
| per stream frame p50 | 41ns | 167ns | — |
| per stream frame p99 | 1.17µs | 2.21µs | 1ms |

**The budget holds with roughly thirty times the headroom, and the figures
doubled.** Both are true and the second is not dismissed by the first: a number
that moves 2x is worth noticing while the margin is large, because that is the
only time it is cheap to.

**What the doubling cannot be attributed to, honestly.** Two things changed
between the runs and this measurement cannot separate them. The gateway gained
real work on the establishment path — `ExactCache` became async with a bounded
lookup (M11.10), per-route TTL resolution (M11.11), and the classifier's
confidence now rides to the audit (M12.5 groundwork). And the host was not
quiet: load average ~4 with another application at ~68% of a core, where the
2026-08-20 figures came from an idle machine. Attributing the change to either
would be inventing a cause, so both are named and neither is chosen. A clean
re-measurement on an idle host is what would settle it, and it has not been
done.

The older figures are kept rather than overwritten. A single number in a doc
reads as "this is what it is"; two dated ones read as "this is how it moves",
which is the more useful thing to know about a budget with this much room.

**The exact cache is not Postgres yet.** The spec names a PG unlogged table and
**no milestone owns building one** — this previously cited "M3.5", which is
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); docs(11): re-measure the overhead budget, and keep both readings by codeitlikemiley · Pull Request #43 · codeitlikemiley/panday · GitHub
Skip to content
Draft
Changes from all commits
Commits
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
37 changes: 31 additions & 6 deletions docs/11-gateway.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -368,12 +368,37 @@ in-process, not a product surface. The gateway is stateless apart from cache
- **M11.6** Exact cache + circuit breakers; p99 overhead budget: <3ms non-streaming, <1ms per stream frame at 100 rps on one core. ✅ *(shipped: `panday_gateway::cache`, `panday_gateway::circuit`, wired in `Gateway::chat`; `tests/cache_and_breakers.rs`, `tests/overhead.rs`.)*

**Measured, release build, single-threaded runtime, 1000 back-to-back requests
(harder than the specified 100 rps — no idle time between them):**
establishment p50 21.6µs / p99 52.0µs against the 3ms budget; per stream frame
p50 41ns / p99 1.17µs against the 1ms budget. The benchmark is `#[ignore]`d
because a wall-clock assertion on shared CI hardware fails for reasons
unrelated to the code, and a flaky test gets muted — which is worse than one
that must be run deliberately.
(harder than the specified 100 rps — no idle time between them).** The
benchmark is `#[ignore]`d because a wall-clock assertion on shared CI hardware
fails for reasons unrelated to the code, and a flaky test gets muted — which is
worse than one that must be run deliberately.

| | 2026-08-20 | 2026-08-24 | budget |
|---|---|---|---|
| establishment p50 | 21.6µs | 49.6µs | — |
| establishment p99 | 52.0µs | 99.1µs | 3ms |
| per stream frame p50 | 41ns | 167ns | — |
| per stream frame p99 | 1.17µs | 2.21µs | 1ms |

**The budget holds with roughly thirty times the headroom, and the figures
doubled.** Both are true and the second is not dismissed by the first: a number
that moves 2x is worth noticing while the margin is large, because that is the
only time it is cheap to.

**What the doubling cannot be attributed to, honestly.** Two things changed
between the runs and this measurement cannot separate them. The gateway gained
real work on the establishment path — `ExactCache` became async with a bounded
lookup (M11.10), per-route TTL resolution (M11.11), and the classifier's
confidence now rides to the audit (M12.5 groundwork). And the host was not
quiet: load average ~4 with another application at ~68% of a core, where the
2026-08-20 figures came from an idle machine. Attributing the change to either
would be inventing a cause, so both are named and neither is chosen. A clean
re-measurement on an idle host is what would settle it, and it has not been
done.

The older figures are kept rather than overwritten. A single number in a doc
reads as "this is what it is"; two dated ones read as "this is how it moves",
which is the more useful thing to know about a budget with this much room.

**The exact cache is not Postgres yet.** The spec names a PG unlogged table and
**no milestone owns building one** — this previously cited "M3.5", which is
Expand Down