docs(protocol): correct depth-refusal contract to match live router behavior - #65

Merged
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy
May 26, 2026
Merged

docs(protocol): correct depth-refusal contract to match live router behavior#65
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Summary

Doc-only correction to the protocol spec that shipped in #64. Investigation of the proposed follow-ups (`agent-gateway` middleware, `cli-bridge` propagation) surfaced two factual inaccuracies I'd written into the spec from assumption rather than measurement.

What I found while investigating the follow-ups

LayerAlready implemented?Evidence
`tangle-router` depth enforcementYes (live)`app/api/chat/route.ts:1390-1410` — reads inbound `x-tangle-forwarded-depth`, refuses with HTTP 429 + `bridge_depth_exceeded` at `CLI_BRIDGE_MAX_DEPTH` (default 4), emits incremented outbound depth
`cli-bridge` authorization forwardingYes (live)`src/routes/chat-completions.ts:190+212` — reads `x-tangle-forwarded-authorization`, threads to sandbox backend as `forwardedAuthorization` metadata
`cli-bridge` depth enforcementNo, but not neededAlways sits downstream of router for sandbox dispatches → bounded transitively
`agent-gateway` middlewareNo, deferredNo production consumer of the forwarded-header path through agent-gateway today; first real consumer drives the work

Doc bugs this fixes

  1. Refusal status code: spec said `413 Payload Too Large`; live router uses `429 Too Many Requests` with body code `bridge_depth_exceeded`. Implementations targeting the spec would have returned the wrong code.
  2. Spec read as fully shipped end-to-end. Added an Implementation status table making per-layer reality explicit so future implementers don't mistake the contract for the live state.

Decision not to build the originally-named follow-ups (yet)

After reading the actual code:

  • `cli-bridge` depth handling is redundant. Depth is enforced upstream at `tangle-router` for the only recursion path that exists today (`bridge/sandbox/*` dispatches). Adding a duplicate check in cli-bridge gains nothing measurable.
  • `agent-gateway` middleware has no current consumer. agent-gateway is in production at gtm-agent + agent-builder, but no caller emits `X-Tangle-Forwarded-*` headers to them today. Building enforcement before a consumer = engineering for a hypothetical.

Both are tracked on the ops board for when a real consumer materializes (a third-party agent-gateway deployment, or an agent-to-agent call that bypasses tangle-router).

What's NOT in this PR

  • No code changes to `agent-runtime` (headers builders are already correct — they emit; refusal is the gateway's job).
  • No changes to `cli-bridge` or `tangle-router`.
  • No new middleware in `agent-gateway`.

This is a 17-line doc fix.

Test plan

  • `pnpm typecheck` — clean
  • `pnpm test` — 354/354
  • biome check — clean (one pre-existing warning in `tests/mcp/in-process-executor.test.ts:116` from main, untouched)

…ehavior
Investigation surfaced two doc inaccuracies the freshly-merged spec doc
inherited from my own assumption rather than measurement:
1. Refusal status code is 429 + body code 'bridge_depth_exceeded' (live
in tangle-router app/api/chat/route.ts:1390-1410), not the 413 the
spec claimed. Updated header table + invariant #5 accordingly.
2. The spec read as fully shipped end-to-end. Added an Implementation
status table making the per-layer reality explicit:
- agent-runtime emits all six headers (this is the work that
shipped in #64).
- tangle-router enforces depth + forwards auth (already live).
- cli-bridge forwards authorization to sandbox backends (already
live); does not enforce depth locally — inherits via router.
- agent-gateway middleware: NOT YET. Deferred to a real consumer.
No code changes. The agent-runtime headers builders and emitters are
already correct (they emit the header; refusal is the gateway's job).
The doc was the only thing out of step.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE. Doc-only fix, 17 lines, no code changes. Verified the three factual claims against source:

  • tangle-router/app/api/chat/route.ts:1390-1410 does refuse with HTTP 429 + bridge_depth_exceeded. ✓
  • cli-bridge/src/routes/chat-completions.ts:190+212 does read x-tangle-forwarded-authorization and thread it to backends. ✓
  • agent-gateway/src/ has zero x-tangle-forwarded-* handling. ✓ (true negative)

Approving without further reservations. The new Implementation status table is exactly the kind of "what's actually shipped vs what the spec demands of conformant implementations" delineation that keeps a normative spec from rotting into vaporware.

Senior staff principal call to NOT build the original two follow-ups is the right one: cli-bridge depth is redundant with router-side enforcement, agent-gateway middleware has no consumer today. Both tracked on ops board for when a consumer surfaces.

@drewstone
drewstone merged commit aa5de1c into mainMay 26, 2026
1 check passed
@drewstone
drewstone deleted the fix/protocol-spec-accuracy branch May 26, 2026 23:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

docs(protocol): correct depth-refusal contract to match live router behavior - #65

Merged
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy
May 26, 2026
Merged

docs(protocol): correct depth-refusal contract to match live router behavior#65
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Summary

Doc-only correction to the protocol spec that shipped in #64. Investigation of the proposed follow-ups (`agent-gateway` middleware, `cli-bridge` propagation) surfaced two factual inaccuracies I'd written into the spec from assumption rather than measurement.

What I found while investigating the follow-ups

LayerAlready implemented?Evidence
`tangle-router` depth enforcementYes (live)`app/api/chat/route.ts:1390-1410` — reads inbound `x-tangle-forwarded-depth`, refuses with HTTP 429 + `bridge_depth_exceeded` at `CLI_BRIDGE_MAX_DEPTH` (default 4), emits incremented outbound depth
`cli-bridge` authorization forwardingYes (live)`src/routes/chat-completions.ts:190+212` — reads `x-tangle-forwarded-authorization`, threads to sandbox backend as `forwardedAuthorization` metadata
`cli-bridge` depth enforcementNo, but not neededAlways sits downstream of router for sandbox dispatches → bounded transitively
`agent-gateway` middlewareNo, deferredNo production consumer of the forwarded-header path through agent-gateway today; first real consumer drives the work

Doc bugs this fixes

  1. Refusal status code: spec said `413 Payload Too Large`; live router uses `429 Too Many Requests` with body code `bridge_depth_exceeded`. Implementations targeting the spec would have returned the wrong code.
  2. Spec read as fully shipped end-to-end. Added an Implementation status table making per-layer reality explicit so future implementers don't mistake the contract for the live state.

Decision not to build the originally-named follow-ups (yet)

After reading the actual code:

  • `cli-bridge` depth handling is redundant. Depth is enforced upstream at `tangle-router` for the only recursion path that exists today (`bridge/sandbox/*` dispatches). Adding a duplicate check in cli-bridge gains nothing measurable.
  • `agent-gateway` middleware has no current consumer. agent-gateway is in production at gtm-agent + agent-builder, but no caller emits `X-Tangle-Forwarded-*` headers to them today. Building enforcement before a consumer = engineering for a hypothetical.

Both are tracked on the ops board for when a real consumer materializes (a third-party agent-gateway deployment, or an agent-to-agent call that bypasses tangle-router).

What's NOT in this PR

  • No code changes to `agent-runtime` (headers builders are already correct — they emit; refusal is the gateway's job).
  • No changes to `cli-bridge` or `tangle-router`.
  • No new middleware in `agent-gateway`.

This is a 17-line doc fix.

Test plan

  • `pnpm typecheck` — clean
  • `pnpm test` — 354/354
  • biome check — clean (one pre-existing warning in `tests/mcp/in-process-executor.test.ts:116` from main, untouched)

…ehavior
Investigation surfaced two doc inaccuracies the freshly-merged spec doc
inherited from my own assumption rather than measurement:
1. Refusal status code is 429 + body code 'bridge_depth_exceeded' (live
in tangle-router app/api/chat/route.ts:1390-1410), not the 413 the
spec claimed. Updated header table + invariant #5 accordingly.
2. The spec read as fully shipped end-to-end. Added an Implementation
status table making the per-layer reality explicit:
- agent-runtime emits all six headers (this is the work that
shipped in #64).
- tangle-router enforces depth + forwards auth (already live).
- cli-bridge forwards authorization to sandbox backends (already
live); does not enforce depth locally — inherits via router.
- agent-gateway middleware: NOT YET. Deferred to a real consumer.
No code changes. The agent-runtime headers builders and emitters are
already correct (they emit the header; refusal is the gateway's job).
The doc was the only thing out of step.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE. Doc-only fix, 17 lines, no code changes. Verified the three factual claims against source:

  • tangle-router/app/api/chat/route.ts:1390-1410 does refuse with HTTP 429 + bridge_depth_exceeded. ✓
  • cli-bridge/src/routes/chat-completions.ts:190+212 does read x-tangle-forwarded-authorization and thread it to backends. ✓
  • agent-gateway/src/ has zero x-tangle-forwarded-* handling. ✓ (true negative)

Approving without further reservations. The new Implementation status table is exactly the kind of "what's actually shipped vs what the spec demands of conformant implementations" delineation that keeps a normative spec from rotting into vaporware.

Senior staff principal call to NOT build the original two follow-ups is the right one: cli-bridge depth is redundant with router-side enforcement, agent-gateway middleware has no consumer today. Both tracked on ops board for when a consumer surfaces.

@drewstone
drewstone merged commit aa5de1c into mainMay 26, 2026
1 check passed
@drewstone
drewstone deleted the fix/protocol-spec-accuracy branch May 26, 2026 23:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(protocol): correct depth-refusal contract to match live router behavior - #65

Merged
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy
May 26, 2026
Merged

docs(protocol): correct depth-refusal contract to match live router behavior#65
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Summary

Doc-only correction to the protocol spec that shipped in #64. Investigation of the proposed follow-ups (`agent-gateway` middleware, `cli-bridge` propagation) surfaced two factual inaccuracies I'd written into the spec from assumption rather than measurement.

What I found while investigating the follow-ups

LayerAlready implemented?Evidence
`tangle-router` depth enforcementYes (live)`app/api/chat/route.ts:1390-1410` — reads inbound `x-tangle-forwarded-depth`, refuses with HTTP 429 + `bridge_depth_exceeded` at `CLI_BRIDGE_MAX_DEPTH` (default 4), emits incremented outbound depth
`cli-bridge` authorization forwardingYes (live)`src/routes/chat-completions.ts:190+212` — reads `x-tangle-forwarded-authorization`, threads to sandbox backend as `forwardedAuthorization` metadata
`cli-bridge` depth enforcementNo, but not neededAlways sits downstream of router for sandbox dispatches → bounded transitively
`agent-gateway` middlewareNo, deferredNo production consumer of the forwarded-header path through agent-gateway today; first real consumer drives the work

Doc bugs this fixes

  1. Refusal status code: spec said `413 Payload Too Large`; live router uses `429 Too Many Requests` with body code `bridge_depth_exceeded`. Implementations targeting the spec would have returned the wrong code.
  2. Spec read as fully shipped end-to-end. Added an Implementation status table making per-layer reality explicit so future implementers don't mistake the contract for the live state.

Decision not to build the originally-named follow-ups (yet)

After reading the actual code:

  • `cli-bridge` depth handling is redundant. Depth is enforced upstream at `tangle-router` for the only recursion path that exists today (`bridge/sandbox/*` dispatches). Adding a duplicate check in cli-bridge gains nothing measurable.
  • `agent-gateway` middleware has no current consumer. agent-gateway is in production at gtm-agent + agent-builder, but no caller emits `X-Tangle-Forwarded-*` headers to them today. Building enforcement before a consumer = engineering for a hypothetical.

Both are tracked on the ops board for when a real consumer materializes (a third-party agent-gateway deployment, or an agent-to-agent call that bypasses tangle-router).

What's NOT in this PR

  • No code changes to `agent-runtime` (headers builders are already correct — they emit; refusal is the gateway's job).
  • No changes to `cli-bridge` or `tangle-router`.
  • No new middleware in `agent-gateway`.

This is a 17-line doc fix.

Test plan

  • `pnpm typecheck` — clean
  • `pnpm test` — 354/354
  • biome check — clean (one pre-existing warning in `tests/mcp/in-process-executor.test.ts:116` from main, untouched)

…ehavior
Investigation surfaced two doc inaccuracies the freshly-merged spec doc
inherited from my own assumption rather than measurement:
1. Refusal status code is 429 + body code 'bridge_depth_exceeded' (live
in tangle-router app/api/chat/route.ts:1390-1410), not the 413 the
spec claimed. Updated header table + invariant #5 accordingly.
2. The spec read as fully shipped end-to-end. Added an Implementation
status table making the per-layer reality explicit:
- agent-runtime emits all six headers (this is the work that
shipped in #64).
- tangle-router enforces depth + forwards auth (already live).
- cli-bridge forwards authorization to sandbox backends (already
live); does not enforce depth locally — inherits via router.
- agent-gateway middleware: NOT YET. Deferred to a real consumer.
No code changes. The agent-runtime headers builders and emitters are
already correct (they emit the header; refusal is the gateway's job).
The doc was the only thing out of step.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE. Doc-only fix, 17 lines, no code changes. Verified the three factual claims against source:

  • tangle-router/app/api/chat/route.ts:1390-1410 does refuse with HTTP 429 + bridge_depth_exceeded. ✓
  • cli-bridge/src/routes/chat-completions.ts:190+212 does read x-tangle-forwarded-authorization and thread it to backends. ✓
  • agent-gateway/src/ has zero x-tangle-forwarded-* handling. ✓ (true negative)

Approving without further reservations. The new Implementation status table is exactly the kind of "what's actually shipped vs what the spec demands of conformant implementations" delineation that keeps a normative spec from rotting into vaporware.

Senior staff principal call to NOT build the original two follow-ups is the right one: cli-bridge depth is redundant with router-side enforcement, agent-gateway middleware has no consumer today. Both tracked on ops board for when a consumer surfaces.

@drewstone
drewstone merged commit aa5de1c into mainMay 26, 2026
1 check passed
@drewstone
drewstone deleted the fix/protocol-spec-accuracy branch May 26, 2026 23:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(protocol): correct depth-refusal contract to match live router behavior - #65

Merged
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy
May 26, 2026
Merged

docs(protocol): correct depth-refusal contract to match live router behavior#65
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Summary

Doc-only correction to the protocol spec that shipped in #64. Investigation of the proposed follow-ups (`agent-gateway` middleware, `cli-bridge` propagation) surfaced two factual inaccuracies I'd written into the spec from assumption rather than measurement.

What I found while investigating the follow-ups

LayerAlready implemented?Evidence
`tangle-router` depth enforcementYes (live)`app/api/chat/route.ts:1390-1410` — reads inbound `x-tangle-forwarded-depth`, refuses with HTTP 429 + `bridge_depth_exceeded` at `CLI_BRIDGE_MAX_DEPTH` (default 4), emits incremented outbound depth
`cli-bridge` authorization forwardingYes (live)`src/routes/chat-completions.ts:190+212` — reads `x-tangle-forwarded-authorization`, threads to sandbox backend as `forwardedAuthorization` metadata
`cli-bridge` depth enforcementNo, but not neededAlways sits downstream of router for sandbox dispatches → bounded transitively
`agent-gateway` middlewareNo, deferredNo production consumer of the forwarded-header path through agent-gateway today; first real consumer drives the work

Doc bugs this fixes

  1. Refusal status code: spec said `413 Payload Too Large`; live router uses `429 Too Many Requests` with body code `bridge_depth_exceeded`. Implementations targeting the spec would have returned the wrong code.
  2. Spec read as fully shipped end-to-end. Added an Implementation status table making per-layer reality explicit so future implementers don't mistake the contract for the live state.

Decision not to build the originally-named follow-ups (yet)

After reading the actual code:

  • `cli-bridge` depth handling is redundant. Depth is enforced upstream at `tangle-router` for the only recursion path that exists today (`bridge/sandbox/*` dispatches). Adding a duplicate check in cli-bridge gains nothing measurable.
  • `agent-gateway` middleware has no current consumer. agent-gateway is in production at gtm-agent + agent-builder, but no caller emits `X-Tangle-Forwarded-*` headers to them today. Building enforcement before a consumer = engineering for a hypothetical.

Both are tracked on the ops board for when a real consumer materializes (a third-party agent-gateway deployment, or an agent-to-agent call that bypasses tangle-router).

What's NOT in this PR

  • No code changes to `agent-runtime` (headers builders are already correct — they emit; refusal is the gateway's job).
  • No changes to `cli-bridge` or `tangle-router`.
  • No new middleware in `agent-gateway`.

This is a 17-line doc fix.

Test plan

  • `pnpm typecheck` — clean
  • `pnpm test` — 354/354
  • biome check — clean (one pre-existing warning in `tests/mcp/in-process-executor.test.ts:116` from main, untouched)

…ehavior
Investigation surfaced two doc inaccuracies the freshly-merged spec doc
inherited from my own assumption rather than measurement:
1. Refusal status code is 429 + body code 'bridge_depth_exceeded' (live
in tangle-router app/api/chat/route.ts:1390-1410), not the 413 the
spec claimed. Updated header table + invariant #5 accordingly.
2. The spec read as fully shipped end-to-end. Added an Implementation
status table making the per-layer reality explicit:
- agent-runtime emits all six headers (this is the work that
shipped in #64).
- tangle-router enforces depth + forwards auth (already live).
- cli-bridge forwards authorization to sandbox backends (already
live); does not enforce depth locally — inherits via router.
- agent-gateway middleware: NOT YET. Deferred to a real consumer.
No code changes. The agent-runtime headers builders and emitters are
already correct (they emit the header; refusal is the gateway's job).
The doc was the only thing out of step.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE. Doc-only fix, 17 lines, no code changes. Verified the three factual claims against source:

  • tangle-router/app/api/chat/route.ts:1390-1410 does refuse with HTTP 429 + bridge_depth_exceeded. ✓
  • cli-bridge/src/routes/chat-completions.ts:190+212 does read x-tangle-forwarded-authorization and thread it to backends. ✓
  • agent-gateway/src/ has zero x-tangle-forwarded-* handling. ✓ (true negative)

Approving without further reservations. The new Implementation status table is exactly the kind of "what's actually shipped vs what the spec demands of conformant implementations" delineation that keeps a normative spec from rotting into vaporware.

Senior staff principal call to NOT build the original two follow-ups is the right one: cli-bridge depth is redundant with router-side enforcement, agent-gateway middleware has no consumer today. Both tracked on ops board for when a consumer surfaces.

@drewstone
drewstone merged commit aa5de1c into mainMay 26, 2026
1 check passed
@drewstone
drewstone deleted the fix/protocol-spec-accuracy branch May 26, 2026 23:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

docs(protocol): correct depth-refusal contract to match live router behavior - #65

Merged
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy
May 26, 2026
Merged

docs(protocol): correct depth-refusal contract to match live router behavior#65
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Summary

Doc-only correction to the protocol spec that shipped in #64. Investigation of the proposed follow-ups (`agent-gateway` middleware, `cli-bridge` propagation) surfaced two factual inaccuracies I'd written into the spec from assumption rather than measurement.

What I found while investigating the follow-ups

LayerAlready implemented?Evidence
`tangle-router` depth enforcementYes (live)`app/api/chat/route.ts:1390-1410` — reads inbound `x-tangle-forwarded-depth`, refuses with HTTP 429 + `bridge_depth_exceeded` at `CLI_BRIDGE_MAX_DEPTH` (default 4), emits incremented outbound depth
`cli-bridge` authorization forwardingYes (live)`src/routes/chat-completions.ts:190+212` — reads `x-tangle-forwarded-authorization`, threads to sandbox backend as `forwardedAuthorization` metadata
`cli-bridge` depth enforcementNo, but not neededAlways sits downstream of router for sandbox dispatches → bounded transitively
`agent-gateway` middlewareNo, deferredNo production consumer of the forwarded-header path through agent-gateway today; first real consumer drives the work

Doc bugs this fixes

  1. Refusal status code: spec said `413 Payload Too Large`; live router uses `429 Too Many Requests` with body code `bridge_depth_exceeded`. Implementations targeting the spec would have returned the wrong code.
  2. Spec read as fully shipped end-to-end. Added an Implementation status table making per-layer reality explicit so future implementers don't mistake the contract for the live state.

Decision not to build the originally-named follow-ups (yet)

After reading the actual code:

  • `cli-bridge` depth handling is redundant. Depth is enforced upstream at `tangle-router` for the only recursion path that exists today (`bridge/sandbox/*` dispatches). Adding a duplicate check in cli-bridge gains nothing measurable.
  • `agent-gateway` middleware has no current consumer. agent-gateway is in production at gtm-agent + agent-builder, but no caller emits `X-Tangle-Forwarded-*` headers to them today. Building enforcement before a consumer = engineering for a hypothetical.

Both are tracked on the ops board for when a real consumer materializes (a third-party agent-gateway deployment, or an agent-to-agent call that bypasses tangle-router).

What's NOT in this PR

  • No code changes to `agent-runtime` (headers builders are already correct — they emit; refusal is the gateway's job).
  • No changes to `cli-bridge` or `tangle-router`.
  • No new middleware in `agent-gateway`.

This is a 17-line doc fix.

Test plan

  • `pnpm typecheck` — clean
  • `pnpm test` — 354/354
  • biome check — clean (one pre-existing warning in `tests/mcp/in-process-executor.test.ts:116` from main, untouched)

…ehavior
Investigation surfaced two doc inaccuracies the freshly-merged spec doc
inherited from my own assumption rather than measurement:
1. Refusal status code is 429 + body code 'bridge_depth_exceeded' (live
in tangle-router app/api/chat/route.ts:1390-1410), not the 413 the
spec claimed. Updated header table + invariant #5 accordingly.
2. The spec read as fully shipped end-to-end. Added an Implementation
status table making the per-layer reality explicit:
- agent-runtime emits all six headers (this is the work that
shipped in #64).
- tangle-router enforces depth + forwards auth (already live).
- cli-bridge forwards authorization to sandbox backends (already
live); does not enforce depth locally — inherits via router.
- agent-gateway middleware: NOT YET. Deferred to a real consumer.
No code changes. The agent-runtime headers builders and emitters are
already correct (they emit the header; refusal is the gateway's job).
The doc was the only thing out of step.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE. Doc-only fix, 17 lines, no code changes. Verified the three factual claims against source:

  • tangle-router/app/api/chat/route.ts:1390-1410 does refuse with HTTP 429 + bridge_depth_exceeded. ✓
  • cli-bridge/src/routes/chat-completions.ts:190+212 does read x-tangle-forwarded-authorization and thread it to backends. ✓
  • agent-gateway/src/ has zero x-tangle-forwarded-* handling. ✓ (true negative)

Approving without further reservations. The new Implementation status table is exactly the kind of "what's actually shipped vs what the spec demands of conformant implementations" delineation that keeps a normative spec from rotting into vaporware.

Senior staff principal call to NOT build the original two follow-ups is the right one: cli-bridge depth is redundant with router-side enforcement, agent-gateway middleware has no consumer today. Both tracked on ops board for when a consumer surfaces.

@drewstone
drewstone merged commit aa5de1c into mainMay 26, 2026
1 check passed
@drewstone
drewstone deleted the fix/protocol-spec-accuracy branch May 26, 2026 23:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(protocol): correct depth-refusal contract to match live router behavior - #65

Merged
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy
May 26, 2026
Merged

docs(protocol): correct depth-refusal contract to match live router behavior#65
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Summary

Doc-only correction to the protocol spec that shipped in #64. Investigation of the proposed follow-ups (`agent-gateway` middleware, `cli-bridge` propagation) surfaced two factual inaccuracies I'd written into the spec from assumption rather than measurement.

What I found while investigating the follow-ups

LayerAlready implemented?Evidence
`tangle-router` depth enforcementYes (live)`app/api/chat/route.ts:1390-1410` — reads inbound `x-tangle-forwarded-depth`, refuses with HTTP 429 + `bridge_depth_exceeded` at `CLI_BRIDGE_MAX_DEPTH` (default 4), emits incremented outbound depth
`cli-bridge` authorization forwardingYes (live)`src/routes/chat-completions.ts:190+212` — reads `x-tangle-forwarded-authorization`, threads to sandbox backend as `forwardedAuthorization` metadata
`cli-bridge` depth enforcementNo, but not neededAlways sits downstream of router for sandbox dispatches → bounded transitively
`agent-gateway` middlewareNo, deferredNo production consumer of the forwarded-header path through agent-gateway today; first real consumer drives the work

Doc bugs this fixes

  1. Refusal status code: spec said `413 Payload Too Large`; live router uses `429 Too Many Requests` with body code `bridge_depth_exceeded`. Implementations targeting the spec would have returned the wrong code.
  2. Spec read as fully shipped end-to-end. Added an Implementation status table making per-layer reality explicit so future implementers don't mistake the contract for the live state.

Decision not to build the originally-named follow-ups (yet)

After reading the actual code:

  • `cli-bridge` depth handling is redundant. Depth is enforced upstream at `tangle-router` for the only recursion path that exists today (`bridge/sandbox/*` dispatches). Adding a duplicate check in cli-bridge gains nothing measurable.
  • `agent-gateway` middleware has no current consumer. agent-gateway is in production at gtm-agent + agent-builder, but no caller emits `X-Tangle-Forwarded-*` headers to them today. Building enforcement before a consumer = engineering for a hypothetical.

Both are tracked on the ops board for when a real consumer materializes (a third-party agent-gateway deployment, or an agent-to-agent call that bypasses tangle-router).

What's NOT in this PR

  • No code changes to `agent-runtime` (headers builders are already correct — they emit; refusal is the gateway's job).
  • No changes to `cli-bridge` or `tangle-router`.
  • No new middleware in `agent-gateway`.

This is a 17-line doc fix.

Test plan

  • `pnpm typecheck` — clean
  • `pnpm test` — 354/354
  • biome check — clean (one pre-existing warning in `tests/mcp/in-process-executor.test.ts:116` from main, untouched)

…ehavior
Investigation surfaced two doc inaccuracies the freshly-merged spec doc
inherited from my own assumption rather than measurement:
1. Refusal status code is 429 + body code 'bridge_depth_exceeded' (live
in tangle-router app/api/chat/route.ts:1390-1410), not the 413 the
spec claimed. Updated header table + invariant #5 accordingly.
2. The spec read as fully shipped end-to-end. Added an Implementation
status table making the per-layer reality explicit:
- agent-runtime emits all six headers (this is the work that
shipped in #64).
- tangle-router enforces depth + forwards auth (already live).
- cli-bridge forwards authorization to sandbox backends (already
live); does not enforce depth locally — inherits via router.
- agent-gateway middleware: NOT YET. Deferred to a real consumer.
No code changes. The agent-runtime headers builders and emitters are
already correct (they emit the header; refusal is the gateway's job).
The doc was the only thing out of step.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE. Doc-only fix, 17 lines, no code changes. Verified the three factual claims against source:

  • tangle-router/app/api/chat/route.ts:1390-1410 does refuse with HTTP 429 + bridge_depth_exceeded. ✓
  • cli-bridge/src/routes/chat-completions.ts:190+212 does read x-tangle-forwarded-authorization and thread it to backends. ✓
  • agent-gateway/src/ has zero x-tangle-forwarded-* handling. ✓ (true negative)

Approving without further reservations. The new Implementation status table is exactly the kind of "what's actually shipped vs what the spec demands of conformant implementations" delineation that keeps a normative spec from rotting into vaporware.

Senior staff principal call to NOT build the original two follow-ups is the right one: cli-bridge depth is redundant with router-side enforcement, agent-gateway middleware has no consumer today. Both tracked on ops board for when a consumer surfaces.

@drewstone
drewstone merged commit aa5de1c into mainMay 26, 2026
1 check passed
@drewstone
drewstone deleted the fix/protocol-spec-accuracy branch May 26, 2026 23:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

docs(protocol): correct depth-refusal contract to match live router behavior - #65

Merged
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy
May 26, 2026
Merged

docs(protocol): correct depth-refusal contract to match live router behavior#65
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Summary

Doc-only correction to the protocol spec that shipped in #64. Investigation of the proposed follow-ups (`agent-gateway` middleware, `cli-bridge` propagation) surfaced two factual inaccuracies I'd written into the spec from assumption rather than measurement.

What I found while investigating the follow-ups

LayerAlready implemented?Evidence
`tangle-router` depth enforcementYes (live)`app/api/chat/route.ts:1390-1410` — reads inbound `x-tangle-forwarded-depth`, refuses with HTTP 429 + `bridge_depth_exceeded` at `CLI_BRIDGE_MAX_DEPTH` (default 4), emits incremented outbound depth
`cli-bridge` authorization forwardingYes (live)`src/routes/chat-completions.ts:190+212` — reads `x-tangle-forwarded-authorization`, threads to sandbox backend as `forwardedAuthorization` metadata
`cli-bridge` depth enforcementNo, but not neededAlways sits downstream of router for sandbox dispatches → bounded transitively
`agent-gateway` middlewareNo, deferredNo production consumer of the forwarded-header path through agent-gateway today; first real consumer drives the work

Doc bugs this fixes

  1. Refusal status code: spec said `413 Payload Too Large`; live router uses `429 Too Many Requests` with body code `bridge_depth_exceeded`. Implementations targeting the spec would have returned the wrong code.
  2. Spec read as fully shipped end-to-end. Added an Implementation status table making per-layer reality explicit so future implementers don't mistake the contract for the live state.

Decision not to build the originally-named follow-ups (yet)

After reading the actual code:

  • `cli-bridge` depth handling is redundant. Depth is enforced upstream at `tangle-router` for the only recursion path that exists today (`bridge/sandbox/*` dispatches). Adding a duplicate check in cli-bridge gains nothing measurable.
  • `agent-gateway` middleware has no current consumer. agent-gateway is in production at gtm-agent + agent-builder, but no caller emits `X-Tangle-Forwarded-*` headers to them today. Building enforcement before a consumer = engineering for a hypothetical.

Both are tracked on the ops board for when a real consumer materializes (a third-party agent-gateway deployment, or an agent-to-agent call that bypasses tangle-router).

What's NOT in this PR

  • No code changes to `agent-runtime` (headers builders are already correct — they emit; refusal is the gateway's job).
  • No changes to `cli-bridge` or `tangle-router`.
  • No new middleware in `agent-gateway`.

This is a 17-line doc fix.

Test plan

  • `pnpm typecheck` — clean
  • `pnpm test` — 354/354
  • biome check — clean (one pre-existing warning in `tests/mcp/in-process-executor.test.ts:116` from main, untouched)

…ehavior
Investigation surfaced two doc inaccuracies the freshly-merged spec doc
inherited from my own assumption rather than measurement:
1. Refusal status code is 429 + body code 'bridge_depth_exceeded' (live
in tangle-router app/api/chat/route.ts:1390-1410), not the 413 the
spec claimed. Updated header table + invariant #5 accordingly.
2. The spec read as fully shipped end-to-end. Added an Implementation
status table making the per-layer reality explicit:
- agent-runtime emits all six headers (this is the work that
shipped in #64).
- tangle-router enforces depth + forwards auth (already live).
- cli-bridge forwards authorization to sandbox backends (already
live); does not enforce depth locally — inherits via router.
- agent-gateway middleware: NOT YET. Deferred to a real consumer.
No code changes. The agent-runtime headers builders and emitters are
already correct (they emit the header; refusal is the gateway's job).
The doc was the only thing out of step.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE. Doc-only fix, 17 lines, no code changes. Verified the three factual claims against source:

  • tangle-router/app/api/chat/route.ts:1390-1410 does refuse with HTTP 429 + bridge_depth_exceeded. ✓
  • cli-bridge/src/routes/chat-completions.ts:190+212 does read x-tangle-forwarded-authorization and thread it to backends. ✓
  • agent-gateway/src/ has zero x-tangle-forwarded-* handling. ✓ (true negative)

Approving without further reservations. The new Implementation status table is exactly the kind of "what's actually shipped vs what the spec demands of conformant implementations" delineation that keeps a normative spec from rotting into vaporware.

Senior staff principal call to NOT build the original two follow-ups is the right one: cli-bridge depth is redundant with router-side enforcement, agent-gateway middleware has no consumer today. Both tracked on ops board for when a consumer surfaces.

@drewstone
drewstone merged commit aa5de1c into mainMay 26, 2026
1 check passed
@drewstone
drewstone deleted the fix/protocol-spec-accuracy branch May 26, 2026 23:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

docs(protocol): correct depth-refusal contract to match live router behavior - #65

Merged
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy
May 26, 2026
Merged

docs(protocol): correct depth-refusal contract to match live router behavior#65
drewstone merged 1 commit into
mainfrom
fix/protocol-spec-accuracy

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Summary

Doc-only correction to the protocol spec that shipped in #64. Investigation of the proposed follow-ups (`agent-gateway` middleware, `cli-bridge` propagation) surfaced two factual inaccuracies I'd written into the spec from assumption rather than measurement.

What I found while investigating the follow-ups

LayerAlready implemented?Evidence
`tangle-router` depth enforcementYes (live)`app/api/chat/route.ts:1390-1410` — reads inbound `x-tangle-forwarded-depth`, refuses with HTTP 429 + `bridge_depth_exceeded` at `CLI_BRIDGE_MAX_DEPTH` (default 4), emits incremented outbound depth
`cli-bridge` authorization forwardingYes (live)`src/routes/chat-completions.ts:190+212` — reads `x-tangle-forwarded-authorization`, threads to sandbox backend as `forwardedAuthorization` metadata
`cli-bridge` depth enforcementNo, but not neededAlways sits downstream of router for sandbox dispatches → bounded transitively
`agent-gateway` middlewareNo, deferredNo production consumer of the forwarded-header path through agent-gateway today; first real consumer drives the work

Doc bugs this fixes

  1. Refusal status code: spec said `413 Payload Too Large`; live router uses `429 Too Many Requests` with body code `bridge_depth_exceeded`. Implementations targeting the spec would have returned the wrong code.
  2. Spec read as fully shipped end-to-end. Added an Implementation status table making per-layer reality explicit so future implementers don't mistake the contract for the live state.

Decision not to build the originally-named follow-ups (yet)

After reading the actual code:

  • `cli-bridge` depth handling is redundant. Depth is enforced upstream at `tangle-router` for the only recursion path that exists today (`bridge/sandbox/*` dispatches). Adding a duplicate check in cli-bridge gains nothing measurable.
  • `agent-gateway` middleware has no current consumer. agent-gateway is in production at gtm-agent + agent-builder, but no caller emits `X-Tangle-Forwarded-*` headers to them today. Building enforcement before a consumer = engineering for a hypothetical.

Both are tracked on the ops board for when a real consumer materializes (a third-party agent-gateway deployment, or an agent-to-agent call that bypasses tangle-router).

What's NOT in this PR

  • No code changes to `agent-runtime` (headers builders are already correct — they emit; refusal is the gateway's job).
  • No changes to `cli-bridge` or `tangle-router`.
  • No new middleware in `agent-gateway`.

This is a 17-line doc fix.

Test plan

  • `pnpm typecheck` — clean
  • `pnpm test` — 354/354
  • biome check — clean (one pre-existing warning in `tests/mcp/in-process-executor.test.ts:116` from main, untouched)

…ehavior
Investigation surfaced two doc inaccuracies the freshly-merged spec doc
inherited from my own assumption rather than measurement:
1. Refusal status code is 429 + body code 'bridge_depth_exceeded' (live
in tangle-router app/api/chat/route.ts:1390-1410), not the 413 the
spec claimed. Updated header table + invariant #5 accordingly.
2. The spec read as fully shipped end-to-end. Added an Implementation
status table making the per-layer reality explicit:
- agent-runtime emits all six headers (this is the work that
shipped in #64).
- tangle-router enforces depth + forwards auth (already live).
- cli-bridge forwards authorization to sandbox backends (already
live); does not enforce depth locally — inherits via router.
- agent-gateway middleware: NOT YET. Deferred to a real consumer.
No code changes. The agent-runtime headers builders and emitters are
already correct (they emit the header; refusal is the gateway's job).
The doc was the only thing out of step.

@tangletoolstangletools left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE. Doc-only fix, 17 lines, no code changes. Verified the three factual claims against source:

  • tangle-router/app/api/chat/route.ts:1390-1410 does refuse with HTTP 429 + bridge_depth_exceeded. ✓
  • cli-bridge/src/routes/chat-completions.ts:190+212 does read x-tangle-forwarded-authorization and thread it to backends. ✓
  • agent-gateway/src/ has zero x-tangle-forwarded-* handling. ✓ (true negative)

Approving without further reservations. The new Implementation status table is exactly the kind of "what's actually shipped vs what the spec demands of conformant implementations" delineation that keeps a normative spec from rotting into vaporware.

Senior staff principal call to NOT build the original two follow-ups is the right one: cli-bridge depth is redundant with router-side enforcement, agent-gateway middleware has no consumer today. Both tracked on ops board for when a consumer surfaces.

@drewstone
drewstone merged commit aa5de1c into mainMay 26, 2026
1 check passed
@drewstone
drewstone deleted the fix/protocol-spec-accuracy branch May 26, 2026 23:45
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@drewstone@tangletools