fix(headless): teach the trajectory exporter the two envelope fields it never learned - #2314

Merged
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift
Aug 6, 2026
Merged

fix(headless): teach the trajectory exporter the two envelope fields it never learned#2314
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Every Maka cell of the #2245 two-arm run exported a one-line summary in place of its trajectory — 89 of 89, all with maka_summary_reason: runtime_event_schema_invalid. Codex exported 89 of 89 complete, 15 to 184 steps each.

That means any analysis built on the normalized ATIF trajectory is blind on our own arm, which is how this surfaced: it is the data source a contamination detector would read.

Refs #2245

Root cause

maka_trajectory.py's _is_runtime_event validates the RuntimeEvent envelope against a hand-copied key whitelist and rejects any event carrying a key it does not list. The runtime's envelope gained origin and modelVisibility; the whitelist never learned them.

Replaying the run's own runtime-events.jsonl, all 89 files fail at the same shape, and always with the same two keys:

89 files, 89 rejected — extra keys: modelVisibility, origin
first: adaptive-rejection-sampler, event 4 of 507
{ ..., "role": "model", "author": "agent",
"origin": "provider", "modelVisibility": "visible", ... }

Both are legitimate optional envelope fields — RUNTIME_EVENT_SHAPE in packages/core/src/runtime-event.ts lists them, and defineObjectShape<RuntimeEvent>() type-forces that list to cover the interface. Only the Python copy could drift, and it did. In this corpus the values are only ever provider/visible or absent, so nothing semantic was lost — the events were simply refused.

Why the existing guard missed it

Core's decoder and the Python exporter already share one validation corpus (runtime-event-validation-corpus.json), run from both sides. It did not catch this because the corpus is a hand-written list of cases: 52 of them, and four envelope keys — origin, modelVisibility, branch, status — set by none of them. It covered the keys someone thought to write cases for.

So the fix is in two parts:

  • maka_trajectory.py accepts both fields with the value constraints the TypeScript decoder applies (provider/code_mode, visible/hidden).
  • The corpus covers all four previously unexercised keys, accepted and rejected, and a new Core test holds the corpus to runtimeEventEnvelopeKeys(). TypeScript already forces that list to cover the interface, so the chain is now: interface → shape → corpus → Python. A field added without a case fails in Core rather than silently blinding a benchmark run.

Verification

Replaying all 89 cells' real runtime-events.jsonl through the exporter, with the run's own status and runtime refs:

beforeafter
full trajectory078
runtime_event_schema_invalid890
image_artifact_metadata_missing011

Recovered trajectories run 9 to 252 steps (median 26).

The 11 remaining cells carry image content whose artifact metadata resolves against a trajectory-state store that is not present in any of the 89 exported cells, so this corpus cannot say whether those 11 would have exported fully in production — a different reason code and a separate question.

Red/green, both directions:

  • Removing the two keys from the Python whitelist again → the corpus-driven Python test fails on valid-provider-origin.
  • Removing the origin corpus cases → the new Core test fails with no corpus case sets the envelope key origin.

npm run -w @maka/core test — 796 pass. npm run -w @maka/headless test — 1421 pass. Lint and format clean.

…it never learned
Every Maka cell of the #2245 benchmark run exported a one-line summary instead
of a trajectory — 89 of 89, against Codex's 89 of 89 complete. The exporter's
envelope check is a hand-copied key whitelist that never learned `origin` and
`modelVisibility`, so the first event carrying either failed the check and the
whole run degraded. Replaying the run's own runtime events through the fixed
check turns 0 full trajectories into 78; the remaining 11 need an artifact
store the export does not carry, so they cannot be judged from it.
The shared validation corpus exists to stop exactly this, and could not: it
exercised the keys someone thought to write cases for, and four envelope keys
— `origin`, `modelVisibility`, `branch`, `status` — were never among them. The
corpus now covers all four, and a contract test holds it to the envelope shape
that TypeScript already forces to cover the interface. A field added without a
case now fails in Core rather than silently blinding a benchmark run.
@Astro-Han
Astro-Hanforce-pushed the fix/harness-maka-trajectory-envelope-drift branch from 3627391 to 41fd5c2CompareAugust 6, 2026 06:26
@Astro-Han
Astro-Han marked this pull request as ready for review August 6, 2026 06:36
@Astro-Han
Astro-Han merged commit 1e1c552 into mainAug 6, 2026
11 checks passed
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.

1 participant

@Astro-Han
, '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

fix(headless): teach the trajectory exporter the two envelope fields it never learned - #2314

Merged
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift
Aug 6, 2026
Merged

fix(headless): teach the trajectory exporter the two envelope fields it never learned#2314
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Every Maka cell of the #2245 two-arm run exported a one-line summary in place of its trajectory — 89 of 89, all with maka_summary_reason: runtime_event_schema_invalid. Codex exported 89 of 89 complete, 15 to 184 steps each.

That means any analysis built on the normalized ATIF trajectory is blind on our own arm, which is how this surfaced: it is the data source a contamination detector would read.

Refs #2245

Root cause

maka_trajectory.py's _is_runtime_event validates the RuntimeEvent envelope against a hand-copied key whitelist and rejects any event carrying a key it does not list. The runtime's envelope gained origin and modelVisibility; the whitelist never learned them.

Replaying the run's own runtime-events.jsonl, all 89 files fail at the same shape, and always with the same two keys:

89 files, 89 rejected — extra keys: modelVisibility, origin
first: adaptive-rejection-sampler, event 4 of 507
{ ..., "role": "model", "author": "agent",
"origin": "provider", "modelVisibility": "visible", ... }

Both are legitimate optional envelope fields — RUNTIME_EVENT_SHAPE in packages/core/src/runtime-event.ts lists them, and defineObjectShape<RuntimeEvent>() type-forces that list to cover the interface. Only the Python copy could drift, and it did. In this corpus the values are only ever provider/visible or absent, so nothing semantic was lost — the events were simply refused.

Why the existing guard missed it

Core's decoder and the Python exporter already share one validation corpus (runtime-event-validation-corpus.json), run from both sides. It did not catch this because the corpus is a hand-written list of cases: 52 of them, and four envelope keys — origin, modelVisibility, branch, status — set by none of them. It covered the keys someone thought to write cases for.

So the fix is in two parts:

  • maka_trajectory.py accepts both fields with the value constraints the TypeScript decoder applies (provider/code_mode, visible/hidden).
  • The corpus covers all four previously unexercised keys, accepted and rejected, and a new Core test holds the corpus to runtimeEventEnvelopeKeys(). TypeScript already forces that list to cover the interface, so the chain is now: interface → shape → corpus → Python. A field added without a case fails in Core rather than silently blinding a benchmark run.

Verification

Replaying all 89 cells' real runtime-events.jsonl through the exporter, with the run's own status and runtime refs:

beforeafter
full trajectory078
runtime_event_schema_invalid890
image_artifact_metadata_missing011

Recovered trajectories run 9 to 252 steps (median 26).

The 11 remaining cells carry image content whose artifact metadata resolves against a trajectory-state store that is not present in any of the 89 exported cells, so this corpus cannot say whether those 11 would have exported fully in production — a different reason code and a separate question.

Red/green, both directions:

  • Removing the two keys from the Python whitelist again → the corpus-driven Python test fails on valid-provider-origin.
  • Removing the origin corpus cases → the new Core test fails with no corpus case sets the envelope key origin.

npm run -w @maka/core test — 796 pass. npm run -w @maka/headless test — 1421 pass. Lint and format clean.

…it never learned
Every Maka cell of the #2245 benchmark run exported a one-line summary instead
of a trajectory — 89 of 89, against Codex's 89 of 89 complete. The exporter's
envelope check is a hand-copied key whitelist that never learned `origin` and
`modelVisibility`, so the first event carrying either failed the check and the
whole run degraded. Replaying the run's own runtime events through the fixed
check turns 0 full trajectories into 78; the remaining 11 need an artifact
store the export does not carry, so they cannot be judged from it.
The shared validation corpus exists to stop exactly this, and could not: it
exercised the keys someone thought to write cases for, and four envelope keys
— `origin`, `modelVisibility`, `branch`, `status` — were never among them. The
corpus now covers all four, and a contract test holds it to the envelope shape
that TypeScript already forces to cover the interface. A field added without a
case now fails in Core rather than silently blinding a benchmark run.
@Astro-Han
Astro-Hanforce-pushed the fix/harness-maka-trajectory-envelope-drift branch from 3627391 to 41fd5c2CompareAugust 6, 2026 06:26
@Astro-Han
Astro-Han marked this pull request as ready for review August 6, 2026 06:36
@Astro-Han
Astro-Han merged commit 1e1c552 into mainAug 6, 2026
11 checks passed
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.

1 participant

@Astro-Han
, '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

fix(headless): teach the trajectory exporter the two envelope fields it never learned - #2314

Merged
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift
Aug 6, 2026
Merged

fix(headless): teach the trajectory exporter the two envelope fields it never learned#2314
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Every Maka cell of the #2245 two-arm run exported a one-line summary in place of its trajectory — 89 of 89, all with maka_summary_reason: runtime_event_schema_invalid. Codex exported 89 of 89 complete, 15 to 184 steps each.

That means any analysis built on the normalized ATIF trajectory is blind on our own arm, which is how this surfaced: it is the data source a contamination detector would read.

Refs #2245

Root cause

maka_trajectory.py's _is_runtime_event validates the RuntimeEvent envelope against a hand-copied key whitelist and rejects any event carrying a key it does not list. The runtime's envelope gained origin and modelVisibility; the whitelist never learned them.

Replaying the run's own runtime-events.jsonl, all 89 files fail at the same shape, and always with the same two keys:

89 files, 89 rejected — extra keys: modelVisibility, origin
first: adaptive-rejection-sampler, event 4 of 507
{ ..., "role": "model", "author": "agent",
"origin": "provider", "modelVisibility": "visible", ... }

Both are legitimate optional envelope fields — RUNTIME_EVENT_SHAPE in packages/core/src/runtime-event.ts lists them, and defineObjectShape<RuntimeEvent>() type-forces that list to cover the interface. Only the Python copy could drift, and it did. In this corpus the values are only ever provider/visible or absent, so nothing semantic was lost — the events were simply refused.

Why the existing guard missed it

Core's decoder and the Python exporter already share one validation corpus (runtime-event-validation-corpus.json), run from both sides. It did not catch this because the corpus is a hand-written list of cases: 52 of them, and four envelope keys — origin, modelVisibility, branch, status — set by none of them. It covered the keys someone thought to write cases for.

So the fix is in two parts:

  • maka_trajectory.py accepts both fields with the value constraints the TypeScript decoder applies (provider/code_mode, visible/hidden).
  • The corpus covers all four previously unexercised keys, accepted and rejected, and a new Core test holds the corpus to runtimeEventEnvelopeKeys(). TypeScript already forces that list to cover the interface, so the chain is now: interface → shape → corpus → Python. A field added without a case fails in Core rather than silently blinding a benchmark run.

Verification

Replaying all 89 cells' real runtime-events.jsonl through the exporter, with the run's own status and runtime refs:

beforeafter
full trajectory078
runtime_event_schema_invalid890
image_artifact_metadata_missing011

Recovered trajectories run 9 to 252 steps (median 26).

The 11 remaining cells carry image content whose artifact metadata resolves against a trajectory-state store that is not present in any of the 89 exported cells, so this corpus cannot say whether those 11 would have exported fully in production — a different reason code and a separate question.

Red/green, both directions:

  • Removing the two keys from the Python whitelist again → the corpus-driven Python test fails on valid-provider-origin.
  • Removing the origin corpus cases → the new Core test fails with no corpus case sets the envelope key origin.

npm run -w @maka/core test — 796 pass. npm run -w @maka/headless test — 1421 pass. Lint and format clean.

…it never learned
Every Maka cell of the #2245 benchmark run exported a one-line summary instead
of a trajectory — 89 of 89, against Codex's 89 of 89 complete. The exporter's
envelope check is a hand-copied key whitelist that never learned `origin` and
`modelVisibility`, so the first event carrying either failed the check and the
whole run degraded. Replaying the run's own runtime events through the fixed
check turns 0 full trajectories into 78; the remaining 11 need an artifact
store the export does not carry, so they cannot be judged from it.
The shared validation corpus exists to stop exactly this, and could not: it
exercised the keys someone thought to write cases for, and four envelope keys
— `origin`, `modelVisibility`, `branch`, `status` — were never among them. The
corpus now covers all four, and a contract test holds it to the envelope shape
that TypeScript already forces to cover the interface. A field added without a
case now fails in Core rather than silently blinding a benchmark run.
@Astro-Han
Astro-Hanforce-pushed the fix/harness-maka-trajectory-envelope-drift branch from 3627391 to 41fd5c2CompareAugust 6, 2026 06:26
@Astro-Han
Astro-Han marked this pull request as ready for review August 6, 2026 06:36
@Astro-Han
Astro-Han merged commit 1e1c552 into mainAug 6, 2026
11 checks passed
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.

1 participant

@Astro-Han
, '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

fix(headless): teach the trajectory exporter the two envelope fields it never learned - #2314

Merged
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift
Aug 6, 2026
Merged

fix(headless): teach the trajectory exporter the two envelope fields it never learned#2314
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Every Maka cell of the #2245 two-arm run exported a one-line summary in place of its trajectory — 89 of 89, all with maka_summary_reason: runtime_event_schema_invalid. Codex exported 89 of 89 complete, 15 to 184 steps each.

That means any analysis built on the normalized ATIF trajectory is blind on our own arm, which is how this surfaced: it is the data source a contamination detector would read.

Refs #2245

Root cause

maka_trajectory.py's _is_runtime_event validates the RuntimeEvent envelope against a hand-copied key whitelist and rejects any event carrying a key it does not list. The runtime's envelope gained origin and modelVisibility; the whitelist never learned them.

Replaying the run's own runtime-events.jsonl, all 89 files fail at the same shape, and always with the same two keys:

89 files, 89 rejected — extra keys: modelVisibility, origin
first: adaptive-rejection-sampler, event 4 of 507
{ ..., "role": "model", "author": "agent",
"origin": "provider", "modelVisibility": "visible", ... }

Both are legitimate optional envelope fields — RUNTIME_EVENT_SHAPE in packages/core/src/runtime-event.ts lists them, and defineObjectShape<RuntimeEvent>() type-forces that list to cover the interface. Only the Python copy could drift, and it did. In this corpus the values are only ever provider/visible or absent, so nothing semantic was lost — the events were simply refused.

Why the existing guard missed it

Core's decoder and the Python exporter already share one validation corpus (runtime-event-validation-corpus.json), run from both sides. It did not catch this because the corpus is a hand-written list of cases: 52 of them, and four envelope keys — origin, modelVisibility, branch, status — set by none of them. It covered the keys someone thought to write cases for.

So the fix is in two parts:

  • maka_trajectory.py accepts both fields with the value constraints the TypeScript decoder applies (provider/code_mode, visible/hidden).
  • The corpus covers all four previously unexercised keys, accepted and rejected, and a new Core test holds the corpus to runtimeEventEnvelopeKeys(). TypeScript already forces that list to cover the interface, so the chain is now: interface → shape → corpus → Python. A field added without a case fails in Core rather than silently blinding a benchmark run.

Verification

Replaying all 89 cells' real runtime-events.jsonl through the exporter, with the run's own status and runtime refs:

beforeafter
full trajectory078
runtime_event_schema_invalid890
image_artifact_metadata_missing011

Recovered trajectories run 9 to 252 steps (median 26).

The 11 remaining cells carry image content whose artifact metadata resolves against a trajectory-state store that is not present in any of the 89 exported cells, so this corpus cannot say whether those 11 would have exported fully in production — a different reason code and a separate question.

Red/green, both directions:

  • Removing the two keys from the Python whitelist again → the corpus-driven Python test fails on valid-provider-origin.
  • Removing the origin corpus cases → the new Core test fails with no corpus case sets the envelope key origin.

npm run -w @maka/core test — 796 pass. npm run -w @maka/headless test — 1421 pass. Lint and format clean.

…it never learned
Every Maka cell of the #2245 benchmark run exported a one-line summary instead
of a trajectory — 89 of 89, against Codex's 89 of 89 complete. The exporter's
envelope check is a hand-copied key whitelist that never learned `origin` and
`modelVisibility`, so the first event carrying either failed the check and the
whole run degraded. Replaying the run's own runtime events through the fixed
check turns 0 full trajectories into 78; the remaining 11 need an artifact
store the export does not carry, so they cannot be judged from it.
The shared validation corpus exists to stop exactly this, and could not: it
exercised the keys someone thought to write cases for, and four envelope keys
— `origin`, `modelVisibility`, `branch`, `status` — were never among them. The
corpus now covers all four, and a contract test holds it to the envelope shape
that TypeScript already forces to cover the interface. A field added without a
case now fails in Core rather than silently blinding a benchmark run.
@Astro-Han
Astro-Hanforce-pushed the fix/harness-maka-trajectory-envelope-drift branch from 3627391 to 41fd5c2CompareAugust 6, 2026 06:26
@Astro-Han
Astro-Han marked this pull request as ready for review August 6, 2026 06:36
@Astro-Han
Astro-Han merged commit 1e1c552 into mainAug 6, 2026
11 checks passed
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.

1 participant

@Astro-Han
, '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

fix(headless): teach the trajectory exporter the two envelope fields it never learned - #2314

Merged
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift
Aug 6, 2026
Merged

fix(headless): teach the trajectory exporter the two envelope fields it never learned#2314
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Every Maka cell of the #2245 two-arm run exported a one-line summary in place of its trajectory — 89 of 89, all with maka_summary_reason: runtime_event_schema_invalid. Codex exported 89 of 89 complete, 15 to 184 steps each.

That means any analysis built on the normalized ATIF trajectory is blind on our own arm, which is how this surfaced: it is the data source a contamination detector would read.

Refs #2245

Root cause

maka_trajectory.py's _is_runtime_event validates the RuntimeEvent envelope against a hand-copied key whitelist and rejects any event carrying a key it does not list. The runtime's envelope gained origin and modelVisibility; the whitelist never learned them.

Replaying the run's own runtime-events.jsonl, all 89 files fail at the same shape, and always with the same two keys:

89 files, 89 rejected — extra keys: modelVisibility, origin
first: adaptive-rejection-sampler, event 4 of 507
{ ..., "role": "model", "author": "agent",
"origin": "provider", "modelVisibility": "visible", ... }

Both are legitimate optional envelope fields — RUNTIME_EVENT_SHAPE in packages/core/src/runtime-event.ts lists them, and defineObjectShape<RuntimeEvent>() type-forces that list to cover the interface. Only the Python copy could drift, and it did. In this corpus the values are only ever provider/visible or absent, so nothing semantic was lost — the events were simply refused.

Why the existing guard missed it

Core's decoder and the Python exporter already share one validation corpus (runtime-event-validation-corpus.json), run from both sides. It did not catch this because the corpus is a hand-written list of cases: 52 of them, and four envelope keys — origin, modelVisibility, branch, status — set by none of them. It covered the keys someone thought to write cases for.

So the fix is in two parts:

  • maka_trajectory.py accepts both fields with the value constraints the TypeScript decoder applies (provider/code_mode, visible/hidden).
  • The corpus covers all four previously unexercised keys, accepted and rejected, and a new Core test holds the corpus to runtimeEventEnvelopeKeys(). TypeScript already forces that list to cover the interface, so the chain is now: interface → shape → corpus → Python. A field added without a case fails in Core rather than silently blinding a benchmark run.

Verification

Replaying all 89 cells' real runtime-events.jsonl through the exporter, with the run's own status and runtime refs:

beforeafter
full trajectory078
runtime_event_schema_invalid890
image_artifact_metadata_missing011

Recovered trajectories run 9 to 252 steps (median 26).

The 11 remaining cells carry image content whose artifact metadata resolves against a trajectory-state store that is not present in any of the 89 exported cells, so this corpus cannot say whether those 11 would have exported fully in production — a different reason code and a separate question.

Red/green, both directions:

  • Removing the two keys from the Python whitelist again → the corpus-driven Python test fails on valid-provider-origin.
  • Removing the origin corpus cases → the new Core test fails with no corpus case sets the envelope key origin.

npm run -w @maka/core test — 796 pass. npm run -w @maka/headless test — 1421 pass. Lint and format clean.

…it never learned
Every Maka cell of the #2245 benchmark run exported a one-line summary instead
of a trajectory — 89 of 89, against Codex's 89 of 89 complete. The exporter's
envelope check is a hand-copied key whitelist that never learned `origin` and
`modelVisibility`, so the first event carrying either failed the check and the
whole run degraded. Replaying the run's own runtime events through the fixed
check turns 0 full trajectories into 78; the remaining 11 need an artifact
store the export does not carry, so they cannot be judged from it.
The shared validation corpus exists to stop exactly this, and could not: it
exercised the keys someone thought to write cases for, and four envelope keys
— `origin`, `modelVisibility`, `branch`, `status` — were never among them. The
corpus now covers all four, and a contract test holds it to the envelope shape
that TypeScript already forces to cover the interface. A field added without a
case now fails in Core rather than silently blinding a benchmark run.
@Astro-Han
Astro-Hanforce-pushed the fix/harness-maka-trajectory-envelope-drift branch from 3627391 to 41fd5c2CompareAugust 6, 2026 06:26
@Astro-Han
Astro-Han marked this pull request as ready for review August 6, 2026 06:36
@Astro-Han
Astro-Han merged commit 1e1c552 into mainAug 6, 2026
11 checks passed
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.

1 participant

@Astro-Han
, '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

fix(headless): teach the trajectory exporter the two envelope fields it never learned - #2314

Merged
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift
Aug 6, 2026
Merged

fix(headless): teach the trajectory exporter the two envelope fields it never learned#2314
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Every Maka cell of the #2245 two-arm run exported a one-line summary in place of its trajectory — 89 of 89, all with maka_summary_reason: runtime_event_schema_invalid. Codex exported 89 of 89 complete, 15 to 184 steps each.

That means any analysis built on the normalized ATIF trajectory is blind on our own arm, which is how this surfaced: it is the data source a contamination detector would read.

Refs #2245

Root cause

maka_trajectory.py's _is_runtime_event validates the RuntimeEvent envelope against a hand-copied key whitelist and rejects any event carrying a key it does not list. The runtime's envelope gained origin and modelVisibility; the whitelist never learned them.

Replaying the run's own runtime-events.jsonl, all 89 files fail at the same shape, and always with the same two keys:

89 files, 89 rejected — extra keys: modelVisibility, origin
first: adaptive-rejection-sampler, event 4 of 507
{ ..., "role": "model", "author": "agent",
"origin": "provider", "modelVisibility": "visible", ... }

Both are legitimate optional envelope fields — RUNTIME_EVENT_SHAPE in packages/core/src/runtime-event.ts lists them, and defineObjectShape<RuntimeEvent>() type-forces that list to cover the interface. Only the Python copy could drift, and it did. In this corpus the values are only ever provider/visible or absent, so nothing semantic was lost — the events were simply refused.

Why the existing guard missed it

Core's decoder and the Python exporter already share one validation corpus (runtime-event-validation-corpus.json), run from both sides. It did not catch this because the corpus is a hand-written list of cases: 52 of them, and four envelope keys — origin, modelVisibility, branch, status — set by none of them. It covered the keys someone thought to write cases for.

So the fix is in two parts:

  • maka_trajectory.py accepts both fields with the value constraints the TypeScript decoder applies (provider/code_mode, visible/hidden).
  • The corpus covers all four previously unexercised keys, accepted and rejected, and a new Core test holds the corpus to runtimeEventEnvelopeKeys(). TypeScript already forces that list to cover the interface, so the chain is now: interface → shape → corpus → Python. A field added without a case fails in Core rather than silently blinding a benchmark run.

Verification

Replaying all 89 cells' real runtime-events.jsonl through the exporter, with the run's own status and runtime refs:

beforeafter
full trajectory078
runtime_event_schema_invalid890
image_artifact_metadata_missing011

Recovered trajectories run 9 to 252 steps (median 26).

The 11 remaining cells carry image content whose artifact metadata resolves against a trajectory-state store that is not present in any of the 89 exported cells, so this corpus cannot say whether those 11 would have exported fully in production — a different reason code and a separate question.

Red/green, both directions:

  • Removing the two keys from the Python whitelist again → the corpus-driven Python test fails on valid-provider-origin.
  • Removing the origin corpus cases → the new Core test fails with no corpus case sets the envelope key origin.

npm run -w @maka/core test — 796 pass. npm run -w @maka/headless test — 1421 pass. Lint and format clean.

…it never learned
Every Maka cell of the #2245 benchmark run exported a one-line summary instead
of a trajectory — 89 of 89, against Codex's 89 of 89 complete. The exporter's
envelope check is a hand-copied key whitelist that never learned `origin` and
`modelVisibility`, so the first event carrying either failed the check and the
whole run degraded. Replaying the run's own runtime events through the fixed
check turns 0 full trajectories into 78; the remaining 11 need an artifact
store the export does not carry, so they cannot be judged from it.
The shared validation corpus exists to stop exactly this, and could not: it
exercised the keys someone thought to write cases for, and four envelope keys
— `origin`, `modelVisibility`, `branch`, `status` — were never among them. The
corpus now covers all four, and a contract test holds it to the envelope shape
that TypeScript already forces to cover the interface. A field added without a
case now fails in Core rather than silently blinding a benchmark run.
@Astro-Han
Astro-Hanforce-pushed the fix/harness-maka-trajectory-envelope-drift branch from 3627391 to 41fd5c2CompareAugust 6, 2026 06:26
@Astro-Han
Astro-Han marked this pull request as ready for review August 6, 2026 06:36
@Astro-Han
Astro-Han merged commit 1e1c552 into mainAug 6, 2026
11 checks passed
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.

1 participant

@Astro-Han
, '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

fix(headless): teach the trajectory exporter the two envelope fields it never learned - #2314

Merged
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift
Aug 6, 2026
Merged

fix(headless): teach the trajectory exporter the two envelope fields it never learned#2314
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Every Maka cell of the #2245 two-arm run exported a one-line summary in place of its trajectory — 89 of 89, all with maka_summary_reason: runtime_event_schema_invalid. Codex exported 89 of 89 complete, 15 to 184 steps each.

That means any analysis built on the normalized ATIF trajectory is blind on our own arm, which is how this surfaced: it is the data source a contamination detector would read.

Refs #2245

Root cause

maka_trajectory.py's _is_runtime_event validates the RuntimeEvent envelope against a hand-copied key whitelist and rejects any event carrying a key it does not list. The runtime's envelope gained origin and modelVisibility; the whitelist never learned them.

Replaying the run's own runtime-events.jsonl, all 89 files fail at the same shape, and always with the same two keys:

89 files, 89 rejected — extra keys: modelVisibility, origin
first: adaptive-rejection-sampler, event 4 of 507
{ ..., "role": "model", "author": "agent",
"origin": "provider", "modelVisibility": "visible", ... }

Both are legitimate optional envelope fields — RUNTIME_EVENT_SHAPE in packages/core/src/runtime-event.ts lists them, and defineObjectShape<RuntimeEvent>() type-forces that list to cover the interface. Only the Python copy could drift, and it did. In this corpus the values are only ever provider/visible or absent, so nothing semantic was lost — the events were simply refused.

Why the existing guard missed it

Core's decoder and the Python exporter already share one validation corpus (runtime-event-validation-corpus.json), run from both sides. It did not catch this because the corpus is a hand-written list of cases: 52 of them, and four envelope keys — origin, modelVisibility, branch, status — set by none of them. It covered the keys someone thought to write cases for.

So the fix is in two parts:

  • maka_trajectory.py accepts both fields with the value constraints the TypeScript decoder applies (provider/code_mode, visible/hidden).
  • The corpus covers all four previously unexercised keys, accepted and rejected, and a new Core test holds the corpus to runtimeEventEnvelopeKeys(). TypeScript already forces that list to cover the interface, so the chain is now: interface → shape → corpus → Python. A field added without a case fails in Core rather than silently blinding a benchmark run.

Verification

Replaying all 89 cells' real runtime-events.jsonl through the exporter, with the run's own status and runtime refs:

beforeafter
full trajectory078
runtime_event_schema_invalid890
image_artifact_metadata_missing011

Recovered trajectories run 9 to 252 steps (median 26).

The 11 remaining cells carry image content whose artifact metadata resolves against a trajectory-state store that is not present in any of the 89 exported cells, so this corpus cannot say whether those 11 would have exported fully in production — a different reason code and a separate question.

Red/green, both directions:

  • Removing the two keys from the Python whitelist again → the corpus-driven Python test fails on valid-provider-origin.
  • Removing the origin corpus cases → the new Core test fails with no corpus case sets the envelope key origin.

npm run -w @maka/core test — 796 pass. npm run -w @maka/headless test — 1421 pass. Lint and format clean.

…it never learned
Every Maka cell of the #2245 benchmark run exported a one-line summary instead
of a trajectory — 89 of 89, against Codex's 89 of 89 complete. The exporter's
envelope check is a hand-copied key whitelist that never learned `origin` and
`modelVisibility`, so the first event carrying either failed the check and the
whole run degraded. Replaying the run's own runtime events through the fixed
check turns 0 full trajectories into 78; the remaining 11 need an artifact
store the export does not carry, so they cannot be judged from it.
The shared validation corpus exists to stop exactly this, and could not: it
exercised the keys someone thought to write cases for, and four envelope keys
— `origin`, `modelVisibility`, `branch`, `status` — were never among them. The
corpus now covers all four, and a contract test holds it to the envelope shape
that TypeScript already forces to cover the interface. A field added without a
case now fails in Core rather than silently blinding a benchmark run.
@Astro-Han
Astro-Hanforce-pushed the fix/harness-maka-trajectory-envelope-drift branch from 3627391 to 41fd5c2CompareAugust 6, 2026 06:26
@Astro-Han
Astro-Han marked this pull request as ready for review August 6, 2026 06:36
@Astro-Han
Astro-Han merged commit 1e1c552 into mainAug 6, 2026
11 checks passed
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.

1 participant

@Astro-Han
, '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

fix(headless): teach the trajectory exporter the two envelope fields it never learned - #2314

Merged
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift
Aug 6, 2026
Merged

fix(headless): teach the trajectory exporter the two envelope fields it never learned#2314
Astro-Han merged 2 commits into
mainfrom
fix/harness-maka-trajectory-envelope-drift

Conversation

@Astro-Han

Copy link
Copy Markdown
Contributor

What

Every Maka cell of the #2245 two-arm run exported a one-line summary in place of its trajectory — 89 of 89, all with maka_summary_reason: runtime_event_schema_invalid. Codex exported 89 of 89 complete, 15 to 184 steps each.

That means any analysis built on the normalized ATIF trajectory is blind on our own arm, which is how this surfaced: it is the data source a contamination detector would read.

Refs #2245

Root cause

maka_trajectory.py's _is_runtime_event validates the RuntimeEvent envelope against a hand-copied key whitelist and rejects any event carrying a key it does not list. The runtime's envelope gained origin and modelVisibility; the whitelist never learned them.

Replaying the run's own runtime-events.jsonl, all 89 files fail at the same shape, and always with the same two keys:

89 files, 89 rejected — extra keys: modelVisibility, origin
first: adaptive-rejection-sampler, event 4 of 507
{ ..., "role": "model", "author": "agent",
"origin": "provider", "modelVisibility": "visible", ... }

Both are legitimate optional envelope fields — RUNTIME_EVENT_SHAPE in packages/core/src/runtime-event.ts lists them, and defineObjectShape<RuntimeEvent>() type-forces that list to cover the interface. Only the Python copy could drift, and it did. In this corpus the values are only ever provider/visible or absent, so nothing semantic was lost — the events were simply refused.

Why the existing guard missed it

Core's decoder and the Python exporter already share one validation corpus (runtime-event-validation-corpus.json), run from both sides. It did not catch this because the corpus is a hand-written list of cases: 52 of them, and four envelope keys — origin, modelVisibility, branch, status — set by none of them. It covered the keys someone thought to write cases for.

So the fix is in two parts:

  • maka_trajectory.py accepts both fields with the value constraints the TypeScript decoder applies (provider/code_mode, visible/hidden).
  • The corpus covers all four previously unexercised keys, accepted and rejected, and a new Core test holds the corpus to runtimeEventEnvelopeKeys(). TypeScript already forces that list to cover the interface, so the chain is now: interface → shape → corpus → Python. A field added without a case fails in Core rather than silently blinding a benchmark run.

Verification

Replaying all 89 cells' real runtime-events.jsonl through the exporter, with the run's own status and runtime refs:

beforeafter
full trajectory078
runtime_event_schema_invalid890
image_artifact_metadata_missing011

Recovered trajectories run 9 to 252 steps (median 26).

The 11 remaining cells carry image content whose artifact metadata resolves against a trajectory-state store that is not present in any of the 89 exported cells, so this corpus cannot say whether those 11 would have exported fully in production — a different reason code and a separate question.

Red/green, both directions:

  • Removing the two keys from the Python whitelist again → the corpus-driven Python test fails on valid-provider-origin.
  • Removing the origin corpus cases → the new Core test fails with no corpus case sets the envelope key origin.

npm run -w @maka/core test — 796 pass. npm run -w @maka/headless test — 1421 pass. Lint and format clean.

…it never learned
Every Maka cell of the #2245 benchmark run exported a one-line summary instead
of a trajectory — 89 of 89, against Codex's 89 of 89 complete. The exporter's
envelope check is a hand-copied key whitelist that never learned `origin` and
`modelVisibility`, so the first event carrying either failed the check and the
whole run degraded. Replaying the run's own runtime events through the fixed
check turns 0 full trajectories into 78; the remaining 11 need an artifact
store the export does not carry, so they cannot be judged from it.
The shared validation corpus exists to stop exactly this, and could not: it
exercised the keys someone thought to write cases for, and four envelope keys
— `origin`, `modelVisibility`, `branch`, `status` — were never among them. The
corpus now covers all four, and a contract test holds it to the envelope shape
that TypeScript already forces to cover the interface. A field added without a
case now fails in Core rather than silently blinding a benchmark run.
@Astro-Han
Astro-Hanforce-pushed the fix/harness-maka-trajectory-envelope-drift branch from 3627391 to 41fd5c2CompareAugust 6, 2026 06:26
@Astro-Han
Astro-Han marked this pull request as ready for review August 6, 2026 06:36
@Astro-Han
Astro-Han merged commit 1e1c552 into mainAug 6, 2026
11 checks passed
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.

1 participant

@Astro-Han