fix(amicode): superseded receipts render their captured diff, not the live view - #74

Merged
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency
Jul 29, 2026
Merged

fix(amicode): superseded receipts render their captured diff, not the live view#74
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Fixes the repeating-formulation-card behaviour, and a worse bug hiding behind it.

The defect

INLINE_KINDS membership was necessary and sufficient for a receipt to render the full entity view inline — and that view reads amicodeProblemView(), the live problem view, rather than a snapshot at the receipt's own seq. Two consequences:

  1. N updates to one entity painted N identical copies of the present. Three formulation edits produced three full cards showing the same current state, so the transcript looked like a history and carried none. This is the visible annoyance.
  2. Switching problems mid-chat retroactively rewrote the transcript.message-timeline.tsx fetches the problem with no ?slug=, and ~/.amico/problems/active is a single global file — so scrolling back to a GHZ formulation after switching to a transmon problem showed the transmon one.

(2) matters more than (1) and is invisible until you hit it. It also breaks any future history-bearing card.

The fix

New pure module receipt-currency.ts: is this receipt the current state of the active problem? Only the current one renders live; everything else falls through to the existing Chip, which already renders from the captured AMICODE_DIFF sentinel. Kept out of card.tsx so it is testable without rendering anything.

Deliberately permissive where currency is ambiguous — a kind with no events yet stays live. The original gate note in card.tsx warns that "a record+update lands as two events but one receipt, and the view can lag a beat, so tighter gates hid the view entirely," and that warning still holds.

Verification

packages/ui336 pass (325 baseline + 11 new), tsgo --noEmit clean. Rebased onto local/amicode after #65#72; zero overlap with those files.

Why this is separate from the warrant work

It is an independent defect fix with no dependency on the deliberation-layer feature branch, and with a hackathon coming it should be mergeable on its own. The feature work that builds on it is #feat/amicode-approval-surfaces.

Design context: spec-20260727-164748-amicode-deliberation-layer-capability-warrants §9.4.

🤖 Generated with Claude Code

…view
Spec-20260727-164748 §9.4 / plan task S1.
Kind membership in INLINE_KINDS was necessary AND sufficient for a receipt
to render the full entity view inline, and that view reads the LIVE problem
view rather than a snapshot at the receipt's own seq. Two defects followed:
1. N updates to one entity painted N identical copies of the present, so
the transcript looked like a history and carried none. This is the
repeating-formulation-card complaint.
2. The transcript fetches the globally-active problem with no ?slug=, and
~/.amico/problems/active is a single global file — so switching problems
mid-chat retroactively rewrote every earlier receipt to the new problem.
Adds receipt-currency.ts: a pure predicate for "is this receipt the current
state of the active problem", kept out of card.tsx so it is testable without
rendering. Only the current receipt renders live; the rest fall through to the
existing Chip, which already renders from the captured AMICODE_DIFF sentinel.
Deliberately permissive where currency is ambiguous — a kind with no events
yet stays live — preserving the original gate note's warning that a
record+update lands as two events but one receipt and the view can lag.
packages/ui: 336 pass (325 baseline + 11 new), tsgo --noEmit clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jack-champagne
jack-champagneforce-pushed the fix/amicode-receipt-currency branch from 78ee045 to 7639a8fCompareJuly 28, 2026 22:52
@jack-champagne
jack-champagne merged commit 42ecbab into local/amicodeJul 29, 2026
2 of 5 checks passed
@aarontrowbridge
aarontrowbridge deleted the fix/amicode-receipt-currency branch August 2, 2026 00:28
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

@aarontrowbridge@jack-champagne
, '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(amicode): superseded receipts render their captured diff, not the live view - #74

Merged
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency
Jul 29, 2026
Merged

fix(amicode): superseded receipts render their captured diff, not the live view#74
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Fixes the repeating-formulation-card behaviour, and a worse bug hiding behind it.

The defect

INLINE_KINDS membership was necessary and sufficient for a receipt to render the full entity view inline — and that view reads amicodeProblemView(), the live problem view, rather than a snapshot at the receipt's own seq. Two consequences:

  1. N updates to one entity painted N identical copies of the present. Three formulation edits produced three full cards showing the same current state, so the transcript looked like a history and carried none. This is the visible annoyance.
  2. Switching problems mid-chat retroactively rewrote the transcript.message-timeline.tsx fetches the problem with no ?slug=, and ~/.amico/problems/active is a single global file — so scrolling back to a GHZ formulation after switching to a transmon problem showed the transmon one.

(2) matters more than (1) and is invisible until you hit it. It also breaks any future history-bearing card.

The fix

New pure module receipt-currency.ts: is this receipt the current state of the active problem? Only the current one renders live; everything else falls through to the existing Chip, which already renders from the captured AMICODE_DIFF sentinel. Kept out of card.tsx so it is testable without rendering anything.

Deliberately permissive where currency is ambiguous — a kind with no events yet stays live. The original gate note in card.tsx warns that "a record+update lands as two events but one receipt, and the view can lag a beat, so tighter gates hid the view entirely," and that warning still holds.

Verification

packages/ui336 pass (325 baseline + 11 new), tsgo --noEmit clean. Rebased onto local/amicode after #65#72; zero overlap with those files.

Why this is separate from the warrant work

It is an independent defect fix with no dependency on the deliberation-layer feature branch, and with a hackathon coming it should be mergeable on its own. The feature work that builds on it is #feat/amicode-approval-surfaces.

Design context: spec-20260727-164748-amicode-deliberation-layer-capability-warrants §9.4.

🤖 Generated with Claude Code

…view
Spec-20260727-164748 §9.4 / plan task S1.
Kind membership in INLINE_KINDS was necessary AND sufficient for a receipt
to render the full entity view inline, and that view reads the LIVE problem
view rather than a snapshot at the receipt's own seq. Two defects followed:
1. N updates to one entity painted N identical copies of the present, so
the transcript looked like a history and carried none. This is the
repeating-formulation-card complaint.
2. The transcript fetches the globally-active problem with no ?slug=, and
~/.amico/problems/active is a single global file — so switching problems
mid-chat retroactively rewrote every earlier receipt to the new problem.
Adds receipt-currency.ts: a pure predicate for "is this receipt the current
state of the active problem", kept out of card.tsx so it is testable without
rendering. Only the current receipt renders live; the rest fall through to the
existing Chip, which already renders from the captured AMICODE_DIFF sentinel.
Deliberately permissive where currency is ambiguous — a kind with no events
yet stays live — preserving the original gate note's warning that a
record+update lands as two events but one receipt and the view can lag.
packages/ui: 336 pass (325 baseline + 11 new), tsgo --noEmit clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jack-champagne
jack-champagneforce-pushed the fix/amicode-receipt-currency branch from 78ee045 to 7639a8fCompareJuly 28, 2026 22:52
@jack-champagne
jack-champagne merged commit 42ecbab into local/amicodeJul 29, 2026
2 of 5 checks passed
@aarontrowbridge
aarontrowbridge deleted the fix/amicode-receipt-currency branch August 2, 2026 00:28
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

@aarontrowbridge@jack-champagne
, '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(amicode): superseded receipts render their captured diff, not the live view - #74

Merged
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency
Jul 29, 2026
Merged

fix(amicode): superseded receipts render their captured diff, not the live view#74
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Fixes the repeating-formulation-card behaviour, and a worse bug hiding behind it.

The defect

INLINE_KINDS membership was necessary and sufficient for a receipt to render the full entity view inline — and that view reads amicodeProblemView(), the live problem view, rather than a snapshot at the receipt's own seq. Two consequences:

  1. N updates to one entity painted N identical copies of the present. Three formulation edits produced three full cards showing the same current state, so the transcript looked like a history and carried none. This is the visible annoyance.
  2. Switching problems mid-chat retroactively rewrote the transcript.message-timeline.tsx fetches the problem with no ?slug=, and ~/.amico/problems/active is a single global file — so scrolling back to a GHZ formulation after switching to a transmon problem showed the transmon one.

(2) matters more than (1) and is invisible until you hit it. It also breaks any future history-bearing card.

The fix

New pure module receipt-currency.ts: is this receipt the current state of the active problem? Only the current one renders live; everything else falls through to the existing Chip, which already renders from the captured AMICODE_DIFF sentinel. Kept out of card.tsx so it is testable without rendering anything.

Deliberately permissive where currency is ambiguous — a kind with no events yet stays live. The original gate note in card.tsx warns that "a record+update lands as two events but one receipt, and the view can lag a beat, so tighter gates hid the view entirely," and that warning still holds.

Verification

packages/ui336 pass (325 baseline + 11 new), tsgo --noEmit clean. Rebased onto local/amicode after #65#72; zero overlap with those files.

Why this is separate from the warrant work

It is an independent defect fix with no dependency on the deliberation-layer feature branch, and with a hackathon coming it should be mergeable on its own. The feature work that builds on it is #feat/amicode-approval-surfaces.

Design context: spec-20260727-164748-amicode-deliberation-layer-capability-warrants §9.4.

🤖 Generated with Claude Code

…view
Spec-20260727-164748 §9.4 / plan task S1.
Kind membership in INLINE_KINDS was necessary AND sufficient for a receipt
to render the full entity view inline, and that view reads the LIVE problem
view rather than a snapshot at the receipt's own seq. Two defects followed:
1. N updates to one entity painted N identical copies of the present, so
the transcript looked like a history and carried none. This is the
repeating-formulation-card complaint.
2. The transcript fetches the globally-active problem with no ?slug=, and
~/.amico/problems/active is a single global file — so switching problems
mid-chat retroactively rewrote every earlier receipt to the new problem.
Adds receipt-currency.ts: a pure predicate for "is this receipt the current
state of the active problem", kept out of card.tsx so it is testable without
rendering. Only the current receipt renders live; the rest fall through to the
existing Chip, which already renders from the captured AMICODE_DIFF sentinel.
Deliberately permissive where currency is ambiguous — a kind with no events
yet stays live — preserving the original gate note's warning that a
record+update lands as two events but one receipt and the view can lag.
packages/ui: 336 pass (325 baseline + 11 new), tsgo --noEmit clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jack-champagne
jack-champagneforce-pushed the fix/amicode-receipt-currency branch from 78ee045 to 7639a8fCompareJuly 28, 2026 22:52
@jack-champagne
jack-champagne merged commit 42ecbab into local/amicodeJul 29, 2026
2 of 5 checks passed
@aarontrowbridge
aarontrowbridge deleted the fix/amicode-receipt-currency branch August 2, 2026 00:28
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

@aarontrowbridge@jack-champagne
, '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(amicode): superseded receipts render their captured diff, not the live view - #74

Merged
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency
Jul 29, 2026
Merged

fix(amicode): superseded receipts render their captured diff, not the live view#74
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Fixes the repeating-formulation-card behaviour, and a worse bug hiding behind it.

The defect

INLINE_KINDS membership was necessary and sufficient for a receipt to render the full entity view inline — and that view reads amicodeProblemView(), the live problem view, rather than a snapshot at the receipt's own seq. Two consequences:

  1. N updates to one entity painted N identical copies of the present. Three formulation edits produced three full cards showing the same current state, so the transcript looked like a history and carried none. This is the visible annoyance.
  2. Switching problems mid-chat retroactively rewrote the transcript.message-timeline.tsx fetches the problem with no ?slug=, and ~/.amico/problems/active is a single global file — so scrolling back to a GHZ formulation after switching to a transmon problem showed the transmon one.

(2) matters more than (1) and is invisible until you hit it. It also breaks any future history-bearing card.

The fix

New pure module receipt-currency.ts: is this receipt the current state of the active problem? Only the current one renders live; everything else falls through to the existing Chip, which already renders from the captured AMICODE_DIFF sentinel. Kept out of card.tsx so it is testable without rendering anything.

Deliberately permissive where currency is ambiguous — a kind with no events yet stays live. The original gate note in card.tsx warns that "a record+update lands as two events but one receipt, and the view can lag a beat, so tighter gates hid the view entirely," and that warning still holds.

Verification

packages/ui336 pass (325 baseline + 11 new), tsgo --noEmit clean. Rebased onto local/amicode after #65#72; zero overlap with those files.

Why this is separate from the warrant work

It is an independent defect fix with no dependency on the deliberation-layer feature branch, and with a hackathon coming it should be mergeable on its own. The feature work that builds on it is #feat/amicode-approval-surfaces.

Design context: spec-20260727-164748-amicode-deliberation-layer-capability-warrants §9.4.

🤖 Generated with Claude Code

…view
Spec-20260727-164748 §9.4 / plan task S1.
Kind membership in INLINE_KINDS was necessary AND sufficient for a receipt
to render the full entity view inline, and that view reads the LIVE problem
view rather than a snapshot at the receipt's own seq. Two defects followed:
1. N updates to one entity painted N identical copies of the present, so
the transcript looked like a history and carried none. This is the
repeating-formulation-card complaint.
2. The transcript fetches the globally-active problem with no ?slug=, and
~/.amico/problems/active is a single global file — so switching problems
mid-chat retroactively rewrote every earlier receipt to the new problem.
Adds receipt-currency.ts: a pure predicate for "is this receipt the current
state of the active problem", kept out of card.tsx so it is testable without
rendering. Only the current receipt renders live; the rest fall through to the
existing Chip, which already renders from the captured AMICODE_DIFF sentinel.
Deliberately permissive where currency is ambiguous — a kind with no events
yet stays live — preserving the original gate note's warning that a
record+update lands as two events but one receipt and the view can lag.
packages/ui: 336 pass (325 baseline + 11 new), tsgo --noEmit clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jack-champagne
jack-champagneforce-pushed the fix/amicode-receipt-currency branch from 78ee045 to 7639a8fCompareJuly 28, 2026 22:52
@jack-champagne
jack-champagne merged commit 42ecbab into local/amicodeJul 29, 2026
2 of 5 checks passed
@aarontrowbridge
aarontrowbridge deleted the fix/amicode-receipt-currency branch August 2, 2026 00:28
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

@aarontrowbridge@jack-champagne
, '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(amicode): superseded receipts render their captured diff, not the live view - #74

Merged
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency
Jul 29, 2026
Merged

fix(amicode): superseded receipts render their captured diff, not the live view#74
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Fixes the repeating-formulation-card behaviour, and a worse bug hiding behind it.

The defect

INLINE_KINDS membership was necessary and sufficient for a receipt to render the full entity view inline — and that view reads amicodeProblemView(), the live problem view, rather than a snapshot at the receipt's own seq. Two consequences:

  1. N updates to one entity painted N identical copies of the present. Three formulation edits produced three full cards showing the same current state, so the transcript looked like a history and carried none. This is the visible annoyance.
  2. Switching problems mid-chat retroactively rewrote the transcript.message-timeline.tsx fetches the problem with no ?slug=, and ~/.amico/problems/active is a single global file — so scrolling back to a GHZ formulation after switching to a transmon problem showed the transmon one.

(2) matters more than (1) and is invisible until you hit it. It also breaks any future history-bearing card.

The fix

New pure module receipt-currency.ts: is this receipt the current state of the active problem? Only the current one renders live; everything else falls through to the existing Chip, which already renders from the captured AMICODE_DIFF sentinel. Kept out of card.tsx so it is testable without rendering anything.

Deliberately permissive where currency is ambiguous — a kind with no events yet stays live. The original gate note in card.tsx warns that "a record+update lands as two events but one receipt, and the view can lag a beat, so tighter gates hid the view entirely," and that warning still holds.

Verification

packages/ui336 pass (325 baseline + 11 new), tsgo --noEmit clean. Rebased onto local/amicode after #65#72; zero overlap with those files.

Why this is separate from the warrant work

It is an independent defect fix with no dependency on the deliberation-layer feature branch, and with a hackathon coming it should be mergeable on its own. The feature work that builds on it is #feat/amicode-approval-surfaces.

Design context: spec-20260727-164748-amicode-deliberation-layer-capability-warrants §9.4.

🤖 Generated with Claude Code

…view
Spec-20260727-164748 §9.4 / plan task S1.
Kind membership in INLINE_KINDS was necessary AND sufficient for a receipt
to render the full entity view inline, and that view reads the LIVE problem
view rather than a snapshot at the receipt's own seq. Two defects followed:
1. N updates to one entity painted N identical copies of the present, so
the transcript looked like a history and carried none. This is the
repeating-formulation-card complaint.
2. The transcript fetches the globally-active problem with no ?slug=, and
~/.amico/problems/active is a single global file — so switching problems
mid-chat retroactively rewrote every earlier receipt to the new problem.
Adds receipt-currency.ts: a pure predicate for "is this receipt the current
state of the active problem", kept out of card.tsx so it is testable without
rendering. Only the current receipt renders live; the rest fall through to the
existing Chip, which already renders from the captured AMICODE_DIFF sentinel.
Deliberately permissive where currency is ambiguous — a kind with no events
yet stays live — preserving the original gate note's warning that a
record+update lands as two events but one receipt and the view can lag.
packages/ui: 336 pass (325 baseline + 11 new), tsgo --noEmit clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jack-champagne
jack-champagneforce-pushed the fix/amicode-receipt-currency branch from 78ee045 to 7639a8fCompareJuly 28, 2026 22:52
@jack-champagne
jack-champagne merged commit 42ecbab into local/amicodeJul 29, 2026
2 of 5 checks passed
@aarontrowbridge
aarontrowbridge deleted the fix/amicode-receipt-currency branch August 2, 2026 00:28
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

@aarontrowbridge@jack-champagne
, '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(amicode): superseded receipts render their captured diff, not the live view - #74

Merged
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency
Jul 29, 2026
Merged

fix(amicode): superseded receipts render their captured diff, not the live view#74
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Fixes the repeating-formulation-card behaviour, and a worse bug hiding behind it.

The defect

INLINE_KINDS membership was necessary and sufficient for a receipt to render the full entity view inline — and that view reads amicodeProblemView(), the live problem view, rather than a snapshot at the receipt's own seq. Two consequences:

  1. N updates to one entity painted N identical copies of the present. Three formulation edits produced three full cards showing the same current state, so the transcript looked like a history and carried none. This is the visible annoyance.
  2. Switching problems mid-chat retroactively rewrote the transcript.message-timeline.tsx fetches the problem with no ?slug=, and ~/.amico/problems/active is a single global file — so scrolling back to a GHZ formulation after switching to a transmon problem showed the transmon one.

(2) matters more than (1) and is invisible until you hit it. It also breaks any future history-bearing card.

The fix

New pure module receipt-currency.ts: is this receipt the current state of the active problem? Only the current one renders live; everything else falls through to the existing Chip, which already renders from the captured AMICODE_DIFF sentinel. Kept out of card.tsx so it is testable without rendering anything.

Deliberately permissive where currency is ambiguous — a kind with no events yet stays live. The original gate note in card.tsx warns that "a record+update lands as two events but one receipt, and the view can lag a beat, so tighter gates hid the view entirely," and that warning still holds.

Verification

packages/ui336 pass (325 baseline + 11 new), tsgo --noEmit clean. Rebased onto local/amicode after #65#72; zero overlap with those files.

Why this is separate from the warrant work

It is an independent defect fix with no dependency on the deliberation-layer feature branch, and with a hackathon coming it should be mergeable on its own. The feature work that builds on it is #feat/amicode-approval-surfaces.

Design context: spec-20260727-164748-amicode-deliberation-layer-capability-warrants §9.4.

🤖 Generated with Claude Code

…view
Spec-20260727-164748 §9.4 / plan task S1.
Kind membership in INLINE_KINDS was necessary AND sufficient for a receipt
to render the full entity view inline, and that view reads the LIVE problem
view rather than a snapshot at the receipt's own seq. Two defects followed:
1. N updates to one entity painted N identical copies of the present, so
the transcript looked like a history and carried none. This is the
repeating-formulation-card complaint.
2. The transcript fetches the globally-active problem with no ?slug=, and
~/.amico/problems/active is a single global file — so switching problems
mid-chat retroactively rewrote every earlier receipt to the new problem.
Adds receipt-currency.ts: a pure predicate for "is this receipt the current
state of the active problem", kept out of card.tsx so it is testable without
rendering. Only the current receipt renders live; the rest fall through to the
existing Chip, which already renders from the captured AMICODE_DIFF sentinel.
Deliberately permissive where currency is ambiguous — a kind with no events
yet stays live — preserving the original gate note's warning that a
record+update lands as two events but one receipt and the view can lag.
packages/ui: 336 pass (325 baseline + 11 new), tsgo --noEmit clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jack-champagne
jack-champagneforce-pushed the fix/amicode-receipt-currency branch from 78ee045 to 7639a8fCompareJuly 28, 2026 22:52
@jack-champagne
jack-champagne merged commit 42ecbab into local/amicodeJul 29, 2026
2 of 5 checks passed
@aarontrowbridge
aarontrowbridge deleted the fix/amicode-receipt-currency branch August 2, 2026 00:28
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

@aarontrowbridge@jack-champagne
, '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(amicode): superseded receipts render their captured diff, not the live view - #74

Merged
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency
Jul 29, 2026
Merged

fix(amicode): superseded receipts render their captured diff, not the live view#74
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Fixes the repeating-formulation-card behaviour, and a worse bug hiding behind it.

The defect

INLINE_KINDS membership was necessary and sufficient for a receipt to render the full entity view inline — and that view reads amicodeProblemView(), the live problem view, rather than a snapshot at the receipt's own seq. Two consequences:

  1. N updates to one entity painted N identical copies of the present. Three formulation edits produced three full cards showing the same current state, so the transcript looked like a history and carried none. This is the visible annoyance.
  2. Switching problems mid-chat retroactively rewrote the transcript.message-timeline.tsx fetches the problem with no ?slug=, and ~/.amico/problems/active is a single global file — so scrolling back to a GHZ formulation after switching to a transmon problem showed the transmon one.

(2) matters more than (1) and is invisible until you hit it. It also breaks any future history-bearing card.

The fix

New pure module receipt-currency.ts: is this receipt the current state of the active problem? Only the current one renders live; everything else falls through to the existing Chip, which already renders from the captured AMICODE_DIFF sentinel. Kept out of card.tsx so it is testable without rendering anything.

Deliberately permissive where currency is ambiguous — a kind with no events yet stays live. The original gate note in card.tsx warns that "a record+update lands as two events but one receipt, and the view can lag a beat, so tighter gates hid the view entirely," and that warning still holds.

Verification

packages/ui336 pass (325 baseline + 11 new), tsgo --noEmit clean. Rebased onto local/amicode after #65#72; zero overlap with those files.

Why this is separate from the warrant work

It is an independent defect fix with no dependency on the deliberation-layer feature branch, and with a hackathon coming it should be mergeable on its own. The feature work that builds on it is #feat/amicode-approval-surfaces.

Design context: spec-20260727-164748-amicode-deliberation-layer-capability-warrants §9.4.

🤖 Generated with Claude Code

…view
Spec-20260727-164748 §9.4 / plan task S1.
Kind membership in INLINE_KINDS was necessary AND sufficient for a receipt
to render the full entity view inline, and that view reads the LIVE problem
view rather than a snapshot at the receipt's own seq. Two defects followed:
1. N updates to one entity painted N identical copies of the present, so
the transcript looked like a history and carried none. This is the
repeating-formulation-card complaint.
2. The transcript fetches the globally-active problem with no ?slug=, and
~/.amico/problems/active is a single global file — so switching problems
mid-chat retroactively rewrote every earlier receipt to the new problem.
Adds receipt-currency.ts: a pure predicate for "is this receipt the current
state of the active problem", kept out of card.tsx so it is testable without
rendering. Only the current receipt renders live; the rest fall through to the
existing Chip, which already renders from the captured AMICODE_DIFF sentinel.
Deliberately permissive where currency is ambiguous — a kind with no events
yet stays live — preserving the original gate note's warning that a
record+update lands as two events but one receipt and the view can lag.
packages/ui: 336 pass (325 baseline + 11 new), tsgo --noEmit clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jack-champagne
jack-champagneforce-pushed the fix/amicode-receipt-currency branch from 78ee045 to 7639a8fCompareJuly 28, 2026 22:52
@jack-champagne
jack-champagne merged commit 42ecbab into local/amicodeJul 29, 2026
2 of 5 checks passed
@aarontrowbridge
aarontrowbridge deleted the fix/amicode-receipt-currency branch August 2, 2026 00:28
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

@aarontrowbridge@jack-champagne
, '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(amicode): superseded receipts render their captured diff, not the live view - #74

Merged
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency
Jul 29, 2026
Merged

fix(amicode): superseded receipts render their captured diff, not the live view#74
jack-champagne merged 1 commit into
local/amicodefrom
fix/amicode-receipt-currency

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Fixes the repeating-formulation-card behaviour, and a worse bug hiding behind it.

The defect

INLINE_KINDS membership was necessary and sufficient for a receipt to render the full entity view inline — and that view reads amicodeProblemView(), the live problem view, rather than a snapshot at the receipt's own seq. Two consequences:

  1. N updates to one entity painted N identical copies of the present. Three formulation edits produced three full cards showing the same current state, so the transcript looked like a history and carried none. This is the visible annoyance.
  2. Switching problems mid-chat retroactively rewrote the transcript.message-timeline.tsx fetches the problem with no ?slug=, and ~/.amico/problems/active is a single global file — so scrolling back to a GHZ formulation after switching to a transmon problem showed the transmon one.

(2) matters more than (1) and is invisible until you hit it. It also breaks any future history-bearing card.

The fix

New pure module receipt-currency.ts: is this receipt the current state of the active problem? Only the current one renders live; everything else falls through to the existing Chip, which already renders from the captured AMICODE_DIFF sentinel. Kept out of card.tsx so it is testable without rendering anything.

Deliberately permissive where currency is ambiguous — a kind with no events yet stays live. The original gate note in card.tsx warns that "a record+update lands as two events but one receipt, and the view can lag a beat, so tighter gates hid the view entirely," and that warning still holds.

Verification

packages/ui336 pass (325 baseline + 11 new), tsgo --noEmit clean. Rebased onto local/amicode after #65#72; zero overlap with those files.

Why this is separate from the warrant work

It is an independent defect fix with no dependency on the deliberation-layer feature branch, and with a hackathon coming it should be mergeable on its own. The feature work that builds on it is #feat/amicode-approval-surfaces.

Design context: spec-20260727-164748-amicode-deliberation-layer-capability-warrants §9.4.

🤖 Generated with Claude Code

…view
Spec-20260727-164748 §9.4 / plan task S1.
Kind membership in INLINE_KINDS was necessary AND sufficient for a receipt
to render the full entity view inline, and that view reads the LIVE problem
view rather than a snapshot at the receipt's own seq. Two defects followed:
1. N updates to one entity painted N identical copies of the present, so
the transcript looked like a history and carried none. This is the
repeating-formulation-card complaint.
2. The transcript fetches the globally-active problem with no ?slug=, and
~/.amico/problems/active is a single global file — so switching problems
mid-chat retroactively rewrote every earlier receipt to the new problem.
Adds receipt-currency.ts: a pure predicate for "is this receipt the current
state of the active problem", kept out of card.tsx so it is testable without
rendering. Only the current receipt renders live; the rest fall through to the
existing Chip, which already renders from the captured AMICODE_DIFF sentinel.
Deliberately permissive where currency is ambiguous — a kind with no events
yet stays live — preserving the original gate note's warning that a
record+update lands as two events but one receipt and the view can lag.
packages/ui: 336 pass (325 baseline + 11 new), tsgo --noEmit clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jack-champagne
jack-champagneforce-pushed the fix/amicode-receipt-currency branch from 78ee045 to 7639a8fCompareJuly 28, 2026 22:52
@jack-champagne
jack-champagne merged commit 42ecbab into local/amicodeJul 29, 2026
2 of 5 checks passed
@aarontrowbridge
aarontrowbridge deleted the fix/amicode-receipt-currency branch August 2, 2026 00:28
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

@aarontrowbridge@jack-champagne