feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996) - #69

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg
Apr 24, 2026
Merged

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996)#69
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg

Conversation

@tyulyukov

@tyulyukovtyulyukov commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

Part 1 of upstream #1996 (see also PR #70 for the correctness refactor).

This PR adds thread.latestUserMessageAt as the primary source for the sidebar thread-row relative-time label, matching CommandPalette.logic.ts:161 which already used the new fallback chain.

One-line behavioral change on apps/web/src/components/Sidebar.tsx:715.

Why a two-PR split

Upstream pingdotgg#1996 contains:

  1. A narrow behavioral fix (sidebar row timestamp) — this PR.
  2. A store-layer correctness refactor (shell-stream authority for sidebar summary flags) — PR fix(store): enforce shell-stream authority for sidebar summary flags (upstream #1996) #70.

The original PR description mischaracterized part 2 as "cleanup with no behavioral delta." It's actually a real correctness fix for the ghost-Pending-Approval bug MEMORY.md warns about. PR #70 lands it properly. See UPSTREAM_DIVERGENCE.md (patched in PR #70) for the corrected ledger entry.

Scope of this PR (unchanged)

PieceOur take
Behavioral fix: Sidebar.tsx thread-row timestampPorted (this PR)
Behavioral fix: CommandPalette.logic.ts thread timestamp✅ Already in HEAD (CommandPalette.logic.ts:161)
SidebarThreadSummary.latestUserMessageAt field✅ Already in HEAD (types.ts:158, store.ts:275,313-319)
Memoization: sidebarThreadByKeyRef✅ Already in HEAD (Sidebar.tsx:1049-1050)
Store-layer refactor (shell-stream authority for sidebar flags)🛠 Split out to PR #70

Test plan

  • bun run typecheck clean
  • apps/web vitest — 1095/1095 passing
  • Manual smoke: send a user message in a thread → sidebar row relative-time label updates immediately (not just after session events)

…ream pingdotgg#1996)
Matches CommandPalette.logic.ts which already uses
thread.latestUserMessageAt ?? thread.updatedAt ?? thread.createdAt.
Sidebar row was still falling back to updatedAt/createdAt, so the
relative-time label stopped refreshing on new user messages in the
same thread.
Ports only the behavioral change from upstream pingdotgg#1996. The rest of
that PR is a store.ts cleanup refactor that collides with MarCode's
Incremental Event Handling (FEATURES.md §1) without behavioral win,
so we leave it out. MarCode already has latestUserMessageAt wired
through SidebarThreadSummary (types.ts:158) and store projection
(store.ts:275-319).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Split upstream pingdotgg#1996 into two ledger entries for the two MarCode PRs
that port it: PR #69 (sidebar row timestamp behavioral fix, 524e93a)
and PR #70 (store.ts shell-stream-authority correctness refactor,
506b808).
- Remove "NOT yet equivalent" note in the Already-equivalent section now
that both halves are ported.
- Drop pingdotgg#1996 from Pending real work; only pingdotgg#2246 remains.
- Add plan-file pointer (/Users/tyulyukov/.claude/plans/cached-napping-sundae.md)
to the pingdotgg#2246 row so the next cycle's porter has the staged-commit strategy.
Corrects the earlier claim that pingdotgg#1996's store.ts refactor was "cleanup
with no behavioral delta" — it's a real correctness fix aligning MarCode
with the stream-separation contract MEMORY.md already requires.
@tyulyukov
tyulyukov merged commit a7796cb into mainApr 24, 2026
5 checks passed
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Record PR #68 (cycle ledger bootstrap), #69 (upstream pingdotgg#1996 sidebar
timestamp), and #71 (upstream pingdotgg#2246 option-array refactor) under the
current cycle's ported set, with deviation notes for pingdotgg#2246.
- Document the post-merge composerDraftStore hotfix (9a8c78f) and its
regression guard.
- Record the Phase 4 real-DB smoke: 0 legacy `$.options` rows across
projection_threads, projection_projects, and orchestration_events;
155 canonical thread rows.
- Move pingdotgg#1996 and pingdotgg#2246 out of "Pending real work" — no real work
outstanding as of 2026-04-24.
- Advance "Baseline after cycle" to ececcdc (the #71 merge SHA).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
Fixes the CI Format step on 8386b03 — my new #69 and #71 table rows
had column widths that didn't match the rest of the doc's oxfmt
alignment. No content changes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tyulyukov
, '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

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996) - #69

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg
Apr 24, 2026
Merged

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996)#69
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg

Conversation

@tyulyukov

@tyulyukovtyulyukov commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

Part 1 of upstream #1996 (see also PR #70 for the correctness refactor).

This PR adds thread.latestUserMessageAt as the primary source for the sidebar thread-row relative-time label, matching CommandPalette.logic.ts:161 which already used the new fallback chain.

One-line behavioral change on apps/web/src/components/Sidebar.tsx:715.

Why a two-PR split

Upstream pingdotgg#1996 contains:

  1. A narrow behavioral fix (sidebar row timestamp) — this PR.
  2. A store-layer correctness refactor (shell-stream authority for sidebar summary flags) — PR fix(store): enforce shell-stream authority for sidebar summary flags (upstream #1996) #70.

The original PR description mischaracterized part 2 as "cleanup with no behavioral delta." It's actually a real correctness fix for the ghost-Pending-Approval bug MEMORY.md warns about. PR #70 lands it properly. See UPSTREAM_DIVERGENCE.md (patched in PR #70) for the corrected ledger entry.

Scope of this PR (unchanged)

PieceOur take
Behavioral fix: Sidebar.tsx thread-row timestampPorted (this PR)
Behavioral fix: CommandPalette.logic.ts thread timestamp✅ Already in HEAD (CommandPalette.logic.ts:161)
SidebarThreadSummary.latestUserMessageAt field✅ Already in HEAD (types.ts:158, store.ts:275,313-319)
Memoization: sidebarThreadByKeyRef✅ Already in HEAD (Sidebar.tsx:1049-1050)
Store-layer refactor (shell-stream authority for sidebar flags)🛠 Split out to PR #70

Test plan

  • bun run typecheck clean
  • apps/web vitest — 1095/1095 passing
  • Manual smoke: send a user message in a thread → sidebar row relative-time label updates immediately (not just after session events)

…ream pingdotgg#1996)
Matches CommandPalette.logic.ts which already uses
thread.latestUserMessageAt ?? thread.updatedAt ?? thread.createdAt.
Sidebar row was still falling back to updatedAt/createdAt, so the
relative-time label stopped refreshing on new user messages in the
same thread.
Ports only the behavioral change from upstream pingdotgg#1996. The rest of
that PR is a store.ts cleanup refactor that collides with MarCode's
Incremental Event Handling (FEATURES.md §1) without behavioral win,
so we leave it out. MarCode already has latestUserMessageAt wired
through SidebarThreadSummary (types.ts:158) and store projection
(store.ts:275-319).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Split upstream pingdotgg#1996 into two ledger entries for the two MarCode PRs
that port it: PR #69 (sidebar row timestamp behavioral fix, 524e93a)
and PR #70 (store.ts shell-stream-authority correctness refactor,
506b808).
- Remove "NOT yet equivalent" note in the Already-equivalent section now
that both halves are ported.
- Drop pingdotgg#1996 from Pending real work; only pingdotgg#2246 remains.
- Add plan-file pointer (/Users/tyulyukov/.claude/plans/cached-napping-sundae.md)
to the pingdotgg#2246 row so the next cycle's porter has the staged-commit strategy.
Corrects the earlier claim that pingdotgg#1996's store.ts refactor was "cleanup
with no behavioral delta" — it's a real correctness fix aligning MarCode
with the stream-separation contract MEMORY.md already requires.
@tyulyukov
tyulyukov merged commit a7796cb into mainApr 24, 2026
5 checks passed
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Record PR #68 (cycle ledger bootstrap), #69 (upstream pingdotgg#1996 sidebar
timestamp), and #71 (upstream pingdotgg#2246 option-array refactor) under the
current cycle's ported set, with deviation notes for pingdotgg#2246.
- Document the post-merge composerDraftStore hotfix (9a8c78f) and its
regression guard.
- Record the Phase 4 real-DB smoke: 0 legacy `$.options` rows across
projection_threads, projection_projects, and orchestration_events;
155 canonical thread rows.
- Move pingdotgg#1996 and pingdotgg#2246 out of "Pending real work" — no real work
outstanding as of 2026-04-24.
- Advance "Baseline after cycle" to ececcdc (the #71 merge SHA).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
Fixes the CI Format step on 8386b03 — my new #69 and #71 table rows
had column widths that didn't match the rest of the doc's oxfmt
alignment. No content changes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tyulyukov
, '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

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996) - #69

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg
Apr 24, 2026
Merged

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996)#69
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg

Conversation

@tyulyukov

@tyulyukovtyulyukov commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

Part 1 of upstream #1996 (see also PR #70 for the correctness refactor).

This PR adds thread.latestUserMessageAt as the primary source for the sidebar thread-row relative-time label, matching CommandPalette.logic.ts:161 which already used the new fallback chain.

One-line behavioral change on apps/web/src/components/Sidebar.tsx:715.

Why a two-PR split

Upstream pingdotgg#1996 contains:

  1. A narrow behavioral fix (sidebar row timestamp) — this PR.
  2. A store-layer correctness refactor (shell-stream authority for sidebar summary flags) — PR fix(store): enforce shell-stream authority for sidebar summary flags (upstream #1996) #70.

The original PR description mischaracterized part 2 as "cleanup with no behavioral delta." It's actually a real correctness fix for the ghost-Pending-Approval bug MEMORY.md warns about. PR #70 lands it properly. See UPSTREAM_DIVERGENCE.md (patched in PR #70) for the corrected ledger entry.

Scope of this PR (unchanged)

PieceOur take
Behavioral fix: Sidebar.tsx thread-row timestampPorted (this PR)
Behavioral fix: CommandPalette.logic.ts thread timestamp✅ Already in HEAD (CommandPalette.logic.ts:161)
SidebarThreadSummary.latestUserMessageAt field✅ Already in HEAD (types.ts:158, store.ts:275,313-319)
Memoization: sidebarThreadByKeyRef✅ Already in HEAD (Sidebar.tsx:1049-1050)
Store-layer refactor (shell-stream authority for sidebar flags)🛠 Split out to PR #70

Test plan

  • bun run typecheck clean
  • apps/web vitest — 1095/1095 passing
  • Manual smoke: send a user message in a thread → sidebar row relative-time label updates immediately (not just after session events)

…ream pingdotgg#1996)
Matches CommandPalette.logic.ts which already uses
thread.latestUserMessageAt ?? thread.updatedAt ?? thread.createdAt.
Sidebar row was still falling back to updatedAt/createdAt, so the
relative-time label stopped refreshing on new user messages in the
same thread.
Ports only the behavioral change from upstream pingdotgg#1996. The rest of
that PR is a store.ts cleanup refactor that collides with MarCode's
Incremental Event Handling (FEATURES.md §1) without behavioral win,
so we leave it out. MarCode already has latestUserMessageAt wired
through SidebarThreadSummary (types.ts:158) and store projection
(store.ts:275-319).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Split upstream pingdotgg#1996 into two ledger entries for the two MarCode PRs
that port it: PR #69 (sidebar row timestamp behavioral fix, 524e93a)
and PR #70 (store.ts shell-stream-authority correctness refactor,
506b808).
- Remove "NOT yet equivalent" note in the Already-equivalent section now
that both halves are ported.
- Drop pingdotgg#1996 from Pending real work; only pingdotgg#2246 remains.
- Add plan-file pointer (/Users/tyulyukov/.claude/plans/cached-napping-sundae.md)
to the pingdotgg#2246 row so the next cycle's porter has the staged-commit strategy.
Corrects the earlier claim that pingdotgg#1996's store.ts refactor was "cleanup
with no behavioral delta" — it's a real correctness fix aligning MarCode
with the stream-separation contract MEMORY.md already requires.
@tyulyukov
tyulyukov merged commit a7796cb into mainApr 24, 2026
5 checks passed
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Record PR #68 (cycle ledger bootstrap), #69 (upstream pingdotgg#1996 sidebar
timestamp), and #71 (upstream pingdotgg#2246 option-array refactor) under the
current cycle's ported set, with deviation notes for pingdotgg#2246.
- Document the post-merge composerDraftStore hotfix (9a8c78f) and its
regression guard.
- Record the Phase 4 real-DB smoke: 0 legacy `$.options` rows across
projection_threads, projection_projects, and orchestration_events;
155 canonical thread rows.
- Move pingdotgg#1996 and pingdotgg#2246 out of "Pending real work" — no real work
outstanding as of 2026-04-24.
- Advance "Baseline after cycle" to ececcdc (the #71 merge SHA).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
Fixes the CI Format step on 8386b03 — my new #69 and #71 table rows
had column widths that didn't match the rest of the doc's oxfmt
alignment. No content changes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tyulyukov
, '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

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996) - #69

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg
Apr 24, 2026
Merged

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996)#69
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg

Conversation

@tyulyukov

@tyulyukovtyulyukov commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

Part 1 of upstream #1996 (see also PR #70 for the correctness refactor).

This PR adds thread.latestUserMessageAt as the primary source for the sidebar thread-row relative-time label, matching CommandPalette.logic.ts:161 which already used the new fallback chain.

One-line behavioral change on apps/web/src/components/Sidebar.tsx:715.

Why a two-PR split

Upstream pingdotgg#1996 contains:

  1. A narrow behavioral fix (sidebar row timestamp) — this PR.
  2. A store-layer correctness refactor (shell-stream authority for sidebar summary flags) — PR fix(store): enforce shell-stream authority for sidebar summary flags (upstream #1996) #70.

The original PR description mischaracterized part 2 as "cleanup with no behavioral delta." It's actually a real correctness fix for the ghost-Pending-Approval bug MEMORY.md warns about. PR #70 lands it properly. See UPSTREAM_DIVERGENCE.md (patched in PR #70) for the corrected ledger entry.

Scope of this PR (unchanged)

PieceOur take
Behavioral fix: Sidebar.tsx thread-row timestampPorted (this PR)
Behavioral fix: CommandPalette.logic.ts thread timestamp✅ Already in HEAD (CommandPalette.logic.ts:161)
SidebarThreadSummary.latestUserMessageAt field✅ Already in HEAD (types.ts:158, store.ts:275,313-319)
Memoization: sidebarThreadByKeyRef✅ Already in HEAD (Sidebar.tsx:1049-1050)
Store-layer refactor (shell-stream authority for sidebar flags)🛠 Split out to PR #70

Test plan

  • bun run typecheck clean
  • apps/web vitest — 1095/1095 passing
  • Manual smoke: send a user message in a thread → sidebar row relative-time label updates immediately (not just after session events)

…ream pingdotgg#1996)
Matches CommandPalette.logic.ts which already uses
thread.latestUserMessageAt ?? thread.updatedAt ?? thread.createdAt.
Sidebar row was still falling back to updatedAt/createdAt, so the
relative-time label stopped refreshing on new user messages in the
same thread.
Ports only the behavioral change from upstream pingdotgg#1996. The rest of
that PR is a store.ts cleanup refactor that collides with MarCode's
Incremental Event Handling (FEATURES.md §1) without behavioral win,
so we leave it out. MarCode already has latestUserMessageAt wired
through SidebarThreadSummary (types.ts:158) and store projection
(store.ts:275-319).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Split upstream pingdotgg#1996 into two ledger entries for the two MarCode PRs
that port it: PR #69 (sidebar row timestamp behavioral fix, 524e93a)
and PR #70 (store.ts shell-stream-authority correctness refactor,
506b808).
- Remove "NOT yet equivalent" note in the Already-equivalent section now
that both halves are ported.
- Drop pingdotgg#1996 from Pending real work; only pingdotgg#2246 remains.
- Add plan-file pointer (/Users/tyulyukov/.claude/plans/cached-napping-sundae.md)
to the pingdotgg#2246 row so the next cycle's porter has the staged-commit strategy.
Corrects the earlier claim that pingdotgg#1996's store.ts refactor was "cleanup
with no behavioral delta" — it's a real correctness fix aligning MarCode
with the stream-separation contract MEMORY.md already requires.
@tyulyukov
tyulyukov merged commit a7796cb into mainApr 24, 2026
5 checks passed
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Record PR #68 (cycle ledger bootstrap), #69 (upstream pingdotgg#1996 sidebar
timestamp), and #71 (upstream pingdotgg#2246 option-array refactor) under the
current cycle's ported set, with deviation notes for pingdotgg#2246.
- Document the post-merge composerDraftStore hotfix (9a8c78f) and its
regression guard.
- Record the Phase 4 real-DB smoke: 0 legacy `$.options` rows across
projection_threads, projection_projects, and orchestration_events;
155 canonical thread rows.
- Move pingdotgg#1996 and pingdotgg#2246 out of "Pending real work" — no real work
outstanding as of 2026-04-24.
- Advance "Baseline after cycle" to ececcdc (the #71 merge SHA).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
Fixes the CI Format step on 8386b03 — my new #69 and #71 table rows
had column widths that didn't match the rest of the doc's oxfmt
alignment. No content changes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tyulyukov
, '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

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996) - #69

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg
Apr 24, 2026
Merged

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996)#69
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg

Conversation

@tyulyukov

@tyulyukovtyulyukov commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

Part 1 of upstream #1996 (see also PR #70 for the correctness refactor).

This PR adds thread.latestUserMessageAt as the primary source for the sidebar thread-row relative-time label, matching CommandPalette.logic.ts:161 which already used the new fallback chain.

One-line behavioral change on apps/web/src/components/Sidebar.tsx:715.

Why a two-PR split

Upstream pingdotgg#1996 contains:

  1. A narrow behavioral fix (sidebar row timestamp) — this PR.
  2. A store-layer correctness refactor (shell-stream authority for sidebar summary flags) — PR fix(store): enforce shell-stream authority for sidebar summary flags (upstream #1996) #70.

The original PR description mischaracterized part 2 as "cleanup with no behavioral delta." It's actually a real correctness fix for the ghost-Pending-Approval bug MEMORY.md warns about. PR #70 lands it properly. See UPSTREAM_DIVERGENCE.md (patched in PR #70) for the corrected ledger entry.

Scope of this PR (unchanged)

PieceOur take
Behavioral fix: Sidebar.tsx thread-row timestampPorted (this PR)
Behavioral fix: CommandPalette.logic.ts thread timestamp✅ Already in HEAD (CommandPalette.logic.ts:161)
SidebarThreadSummary.latestUserMessageAt field✅ Already in HEAD (types.ts:158, store.ts:275,313-319)
Memoization: sidebarThreadByKeyRef✅ Already in HEAD (Sidebar.tsx:1049-1050)
Store-layer refactor (shell-stream authority for sidebar flags)🛠 Split out to PR #70

Test plan

  • bun run typecheck clean
  • apps/web vitest — 1095/1095 passing
  • Manual smoke: send a user message in a thread → sidebar row relative-time label updates immediately (not just after session events)

…ream pingdotgg#1996)
Matches CommandPalette.logic.ts which already uses
thread.latestUserMessageAt ?? thread.updatedAt ?? thread.createdAt.
Sidebar row was still falling back to updatedAt/createdAt, so the
relative-time label stopped refreshing on new user messages in the
same thread.
Ports only the behavioral change from upstream pingdotgg#1996. The rest of
that PR is a store.ts cleanup refactor that collides with MarCode's
Incremental Event Handling (FEATURES.md §1) without behavioral win,
so we leave it out. MarCode already has latestUserMessageAt wired
through SidebarThreadSummary (types.ts:158) and store projection
(store.ts:275-319).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Split upstream pingdotgg#1996 into two ledger entries for the two MarCode PRs
that port it: PR #69 (sidebar row timestamp behavioral fix, 524e93a)
and PR #70 (store.ts shell-stream-authority correctness refactor,
506b808).
- Remove "NOT yet equivalent" note in the Already-equivalent section now
that both halves are ported.
- Drop pingdotgg#1996 from Pending real work; only pingdotgg#2246 remains.
- Add plan-file pointer (/Users/tyulyukov/.claude/plans/cached-napping-sundae.md)
to the pingdotgg#2246 row so the next cycle's porter has the staged-commit strategy.
Corrects the earlier claim that pingdotgg#1996's store.ts refactor was "cleanup
with no behavioral delta" — it's a real correctness fix aligning MarCode
with the stream-separation contract MEMORY.md already requires.
@tyulyukov
tyulyukov merged commit a7796cb into mainApr 24, 2026
5 checks passed
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Record PR #68 (cycle ledger bootstrap), #69 (upstream pingdotgg#1996 sidebar
timestamp), and #71 (upstream pingdotgg#2246 option-array refactor) under the
current cycle's ported set, with deviation notes for pingdotgg#2246.
- Document the post-merge composerDraftStore hotfix (9a8c78f) and its
regression guard.
- Record the Phase 4 real-DB smoke: 0 legacy `$.options` rows across
projection_threads, projection_projects, and orchestration_events;
155 canonical thread rows.
- Move pingdotgg#1996 and pingdotgg#2246 out of "Pending real work" — no real work
outstanding as of 2026-04-24.
- Advance "Baseline after cycle" to ececcdc (the #71 merge SHA).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
Fixes the CI Format step on 8386b03 — my new #69 and #71 table rows
had column widths that didn't match the rest of the doc's oxfmt
alignment. No content changes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tyulyukov
, '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

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996) - #69

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg
Apr 24, 2026
Merged

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996)#69
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg

Conversation

@tyulyukov

@tyulyukovtyulyukov commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

Part 1 of upstream #1996 (see also PR #70 for the correctness refactor).

This PR adds thread.latestUserMessageAt as the primary source for the sidebar thread-row relative-time label, matching CommandPalette.logic.ts:161 which already used the new fallback chain.

One-line behavioral change on apps/web/src/components/Sidebar.tsx:715.

Why a two-PR split

Upstream pingdotgg#1996 contains:

  1. A narrow behavioral fix (sidebar row timestamp) — this PR.
  2. A store-layer correctness refactor (shell-stream authority for sidebar summary flags) — PR fix(store): enforce shell-stream authority for sidebar summary flags (upstream #1996) #70.

The original PR description mischaracterized part 2 as "cleanup with no behavioral delta." It's actually a real correctness fix for the ghost-Pending-Approval bug MEMORY.md warns about. PR #70 lands it properly. See UPSTREAM_DIVERGENCE.md (patched in PR #70) for the corrected ledger entry.

Scope of this PR (unchanged)

PieceOur take
Behavioral fix: Sidebar.tsx thread-row timestampPorted (this PR)
Behavioral fix: CommandPalette.logic.ts thread timestamp✅ Already in HEAD (CommandPalette.logic.ts:161)
SidebarThreadSummary.latestUserMessageAt field✅ Already in HEAD (types.ts:158, store.ts:275,313-319)
Memoization: sidebarThreadByKeyRef✅ Already in HEAD (Sidebar.tsx:1049-1050)
Store-layer refactor (shell-stream authority for sidebar flags)🛠 Split out to PR #70

Test plan

  • bun run typecheck clean
  • apps/web vitest — 1095/1095 passing
  • Manual smoke: send a user message in a thread → sidebar row relative-time label updates immediately (not just after session events)

…ream pingdotgg#1996)
Matches CommandPalette.logic.ts which already uses
thread.latestUserMessageAt ?? thread.updatedAt ?? thread.createdAt.
Sidebar row was still falling back to updatedAt/createdAt, so the
relative-time label stopped refreshing on new user messages in the
same thread.
Ports only the behavioral change from upstream pingdotgg#1996. The rest of
that PR is a store.ts cleanup refactor that collides with MarCode's
Incremental Event Handling (FEATURES.md §1) without behavioral win,
so we leave it out. MarCode already has latestUserMessageAt wired
through SidebarThreadSummary (types.ts:158) and store projection
(store.ts:275-319).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Split upstream pingdotgg#1996 into two ledger entries for the two MarCode PRs
that port it: PR #69 (sidebar row timestamp behavioral fix, 524e93a)
and PR #70 (store.ts shell-stream-authority correctness refactor,
506b808).
- Remove "NOT yet equivalent" note in the Already-equivalent section now
that both halves are ported.
- Drop pingdotgg#1996 from Pending real work; only pingdotgg#2246 remains.
- Add plan-file pointer (/Users/tyulyukov/.claude/plans/cached-napping-sundae.md)
to the pingdotgg#2246 row so the next cycle's porter has the staged-commit strategy.
Corrects the earlier claim that pingdotgg#1996's store.ts refactor was "cleanup
with no behavioral delta" — it's a real correctness fix aligning MarCode
with the stream-separation contract MEMORY.md already requires.
@tyulyukov
tyulyukov merged commit a7796cb into mainApr 24, 2026
5 checks passed
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Record PR #68 (cycle ledger bootstrap), #69 (upstream pingdotgg#1996 sidebar
timestamp), and #71 (upstream pingdotgg#2246 option-array refactor) under the
current cycle's ported set, with deviation notes for pingdotgg#2246.
- Document the post-merge composerDraftStore hotfix (9a8c78f) and its
regression guard.
- Record the Phase 4 real-DB smoke: 0 legacy `$.options` rows across
projection_threads, projection_projects, and orchestration_events;
155 canonical thread rows.
- Move pingdotgg#1996 and pingdotgg#2246 out of "Pending real work" — no real work
outstanding as of 2026-04-24.
- Advance "Baseline after cycle" to ececcdc (the #71 merge SHA).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
Fixes the CI Format step on 8386b03 — my new #69 and #71 table rows
had column widths that didn't match the rest of the doc's oxfmt
alignment. No content changes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tyulyukov
, '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

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996) - #69

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg
Apr 24, 2026
Merged

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996)#69
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg

Conversation

@tyulyukov

@tyulyukovtyulyukov commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

Part 1 of upstream #1996 (see also PR #70 for the correctness refactor).

This PR adds thread.latestUserMessageAt as the primary source for the sidebar thread-row relative-time label, matching CommandPalette.logic.ts:161 which already used the new fallback chain.

One-line behavioral change on apps/web/src/components/Sidebar.tsx:715.

Why a two-PR split

Upstream pingdotgg#1996 contains:

  1. A narrow behavioral fix (sidebar row timestamp) — this PR.
  2. A store-layer correctness refactor (shell-stream authority for sidebar summary flags) — PR fix(store): enforce shell-stream authority for sidebar summary flags (upstream #1996) #70.

The original PR description mischaracterized part 2 as "cleanup with no behavioral delta." It's actually a real correctness fix for the ghost-Pending-Approval bug MEMORY.md warns about. PR #70 lands it properly. See UPSTREAM_DIVERGENCE.md (patched in PR #70) for the corrected ledger entry.

Scope of this PR (unchanged)

PieceOur take
Behavioral fix: Sidebar.tsx thread-row timestampPorted (this PR)
Behavioral fix: CommandPalette.logic.ts thread timestamp✅ Already in HEAD (CommandPalette.logic.ts:161)
SidebarThreadSummary.latestUserMessageAt field✅ Already in HEAD (types.ts:158, store.ts:275,313-319)
Memoization: sidebarThreadByKeyRef✅ Already in HEAD (Sidebar.tsx:1049-1050)
Store-layer refactor (shell-stream authority for sidebar flags)🛠 Split out to PR #70

Test plan

  • bun run typecheck clean
  • apps/web vitest — 1095/1095 passing
  • Manual smoke: send a user message in a thread → sidebar row relative-time label updates immediately (not just after session events)

…ream pingdotgg#1996)
Matches CommandPalette.logic.ts which already uses
thread.latestUserMessageAt ?? thread.updatedAt ?? thread.createdAt.
Sidebar row was still falling back to updatedAt/createdAt, so the
relative-time label stopped refreshing on new user messages in the
same thread.
Ports only the behavioral change from upstream pingdotgg#1996. The rest of
that PR is a store.ts cleanup refactor that collides with MarCode's
Incremental Event Handling (FEATURES.md §1) without behavioral win,
so we leave it out. MarCode already has latestUserMessageAt wired
through SidebarThreadSummary (types.ts:158) and store projection
(store.ts:275-319).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Split upstream pingdotgg#1996 into two ledger entries for the two MarCode PRs
that port it: PR #69 (sidebar row timestamp behavioral fix, 524e93a)
and PR #70 (store.ts shell-stream-authority correctness refactor,
506b808).
- Remove "NOT yet equivalent" note in the Already-equivalent section now
that both halves are ported.
- Drop pingdotgg#1996 from Pending real work; only pingdotgg#2246 remains.
- Add plan-file pointer (/Users/tyulyukov/.claude/plans/cached-napping-sundae.md)
to the pingdotgg#2246 row so the next cycle's porter has the staged-commit strategy.
Corrects the earlier claim that pingdotgg#1996's store.ts refactor was "cleanup
with no behavioral delta" — it's a real correctness fix aligning MarCode
with the stream-separation contract MEMORY.md already requires.
@tyulyukov
tyulyukov merged commit a7796cb into mainApr 24, 2026
5 checks passed
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Record PR #68 (cycle ledger bootstrap), #69 (upstream pingdotgg#1996 sidebar
timestamp), and #71 (upstream pingdotgg#2246 option-array refactor) under the
current cycle's ported set, with deviation notes for pingdotgg#2246.
- Document the post-merge composerDraftStore hotfix (9a8c78f) and its
regression guard.
- Record the Phase 4 real-DB smoke: 0 legacy `$.options` rows across
projection_threads, projection_projects, and orchestration_events;
155 canonical thread rows.
- Move pingdotgg#1996 and pingdotgg#2246 out of "Pending real work" — no real work
outstanding as of 2026-04-24.
- Advance "Baseline after cycle" to ececcdc (the #71 merge SHA).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
Fixes the CI Format step on 8386b03 — my new #69 and #71 table rows
had column widths that didn't match the rest of the doc's oxfmt
alignment. No content changes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tyulyukov
, '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

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996) - #69

Merged
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg
Apr 24, 2026
Merged

feat(sidebar): latestUserMessageAt for thread row timestamp (upstream #1996)#69
tyulyukov merged 1 commit into
mainfrom
marcode/port-thread-timestamp-latest-user-msg

Conversation

@tyulyukov

@tyulyukovtyulyukov commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

Part 1 of upstream #1996 (see also PR #70 for the correctness refactor).

This PR adds thread.latestUserMessageAt as the primary source for the sidebar thread-row relative-time label, matching CommandPalette.logic.ts:161 which already used the new fallback chain.

One-line behavioral change on apps/web/src/components/Sidebar.tsx:715.

Why a two-PR split

Upstream pingdotgg#1996 contains:

  1. A narrow behavioral fix (sidebar row timestamp) — this PR.
  2. A store-layer correctness refactor (shell-stream authority for sidebar summary flags) — PR fix(store): enforce shell-stream authority for sidebar summary flags (upstream #1996) #70.

The original PR description mischaracterized part 2 as "cleanup with no behavioral delta." It's actually a real correctness fix for the ghost-Pending-Approval bug MEMORY.md warns about. PR #70 lands it properly. See UPSTREAM_DIVERGENCE.md (patched in PR #70) for the corrected ledger entry.

Scope of this PR (unchanged)

PieceOur take
Behavioral fix: Sidebar.tsx thread-row timestampPorted (this PR)
Behavioral fix: CommandPalette.logic.ts thread timestamp✅ Already in HEAD (CommandPalette.logic.ts:161)
SidebarThreadSummary.latestUserMessageAt field✅ Already in HEAD (types.ts:158, store.ts:275,313-319)
Memoization: sidebarThreadByKeyRef✅ Already in HEAD (Sidebar.tsx:1049-1050)
Store-layer refactor (shell-stream authority for sidebar flags)🛠 Split out to PR #70

Test plan

  • bun run typecheck clean
  • apps/web vitest — 1095/1095 passing
  • Manual smoke: send a user message in a thread → sidebar row relative-time label updates immediately (not just after session events)

…ream pingdotgg#1996)
Matches CommandPalette.logic.ts which already uses
thread.latestUserMessageAt ?? thread.updatedAt ?? thread.createdAt.
Sidebar row was still falling back to updatedAt/createdAt, so the
relative-time label stopped refreshing on new user messages in the
same thread.
Ports only the behavioral change from upstream pingdotgg#1996. The rest of
that PR is a store.ts cleanup refactor that collides with MarCode's
Incremental Event Handling (FEATURES.md §1) without behavioral win,
so we leave it out. MarCode already has latestUserMessageAt wired
through SidebarThreadSummary (types.ts:158) and store projection
(store.ts:275-319).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Split upstream pingdotgg#1996 into two ledger entries for the two MarCode PRs
that port it: PR #69 (sidebar row timestamp behavioral fix, 524e93a)
and PR #70 (store.ts shell-stream-authority correctness refactor,
506b808).
- Remove "NOT yet equivalent" note in the Already-equivalent section now
that both halves are ported.
- Drop pingdotgg#1996 from Pending real work; only pingdotgg#2246 remains.
- Add plan-file pointer (/Users/tyulyukov/.claude/plans/cached-napping-sundae.md)
to the pingdotgg#2246 row so the next cycle's porter has the staged-commit strategy.
Corrects the earlier claim that pingdotgg#1996's store.ts refactor was "cleanup
with no behavioral delta" — it's a real correctness fix aligning MarCode
with the stream-separation contract MEMORY.md already requires.
@tyulyukov
tyulyukov merged commit a7796cb into mainApr 24, 2026
5 checks passed
tyulyukov added a commit that referenced this pull request Apr 24, 2026
- Record PR #68 (cycle ledger bootstrap), #69 (upstream pingdotgg#1996 sidebar
timestamp), and #71 (upstream pingdotgg#2246 option-array refactor) under the
current cycle's ported set, with deviation notes for pingdotgg#2246.
- Document the post-merge composerDraftStore hotfix (9a8c78f) and its
regression guard.
- Record the Phase 4 real-DB smoke: 0 legacy `$.options` rows across
projection_threads, projection_projects, and orchestration_events;
155 canonical thread rows.
- Move pingdotgg#1996 and pingdotgg#2246 out of "Pending real work" — no real work
outstanding as of 2026-04-24.
- Advance "Baseline after cycle" to ececcdc (the #71 merge SHA).
tyulyukov added a commit that referenced this pull request Apr 24, 2026
Fixes the CI Format step on 8386b03 — my new #69 and #71 table rows
had column widths that didn't match the rest of the doc's oxfmt
alignment. No content changes.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@tyulyukov