openclaw - ✅(Solved) Fix Dreaming Advanced page maps 'From Daily Log' to groundedCount instead of dailyCount [1 pull requests, 1 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#68904Fetched 2026-04-19 15:06:26
View on GitHub
Comments
1
Participants
2
Timeline
3
Reactions
0
Author
Timeline (top)
commented ×1cross-referenced ×1referenced ×1

The Dreaming Advanced page appears to label and summarize grounded replay entries as "From Daily Log", which does not match the underlying short-term recall store semantics.

In my current local state:

  • dailyCount > 0: 524 entries
  • groundedCount > 0: 0 entries
  • UI shows "From Daily Log: 0"

This strongly suggests the page is using groundedCount for the "From Daily Log" summary/badges instead of dailyCount.

Root Cause

The Dreaming Advanced page appears to label and summarize grounded replay entries as "From Daily Log", which does not match the underlying short-term recall store semantics.

In my current local state:

  • dailyCount > 0: 524 entries
  • groundedCount > 0: 0 entries
  • UI shows "From Daily Log: 0"

This strongly suggests the page is using groundedCount for the "From Daily Log" summary/badges instead of dailyCount.

Fix Action

Fixed

PR fix notes

PR #68942: fix: map 'From Daily Log' badge to dailyCount, not groundedCount

Description (problem / solution / changelog)

Summary

Fixes #68904.

describeWaitingEntryOrigin in ui/src/ui/views/dreaming.ts was returning the "From Daily Log" (originDailyLog) badge whenever an entry had groundedCount > 0. However:

  • groundedCount — tracks signals accumulated via the grounded dreaming-replay phase (i.e. how many times the dreaming system revisited this chunk through its replay passes).
  • dailyCount — tracks signals from the daily activity log (incremented for signalType === "daily" in short-term-promotion.ts).

These are distinct concepts. "From Daily Log" should correspond to dailyCount, not groundedCount.

Change

// Before
function describeWaitingEntryOrigin(entry: DreamingEntry): string {
  const hasGroundedReplay = entry.groundedCount > 0;
  const hasLiveSupport = entry.recallCount > 0 || entry.dailyCount > 0;
  if (hasGroundedReplay && hasLiveSupport) {
    return t("dreaming.advanced.originMixed");
  }
  if (hasGroundedReplay) {           // ← wrong field
    return t("dreaming.advanced.originDailyLog");
  }
  return t("dreaming.advanced.originLive");
}

// After
function describeWaitingEntryOrigin(entry: DreamingEntry): string {
  const hasGroundedReplay = entry.groundedCount > 0;
  const hasDailyLog = entry.dailyCount > 0;
  const hasLiveSupport = entry.recallCount > 0 || hasDailyLog;
  if (hasGroundedReplay && hasLiveSupport) {
    return t("dreaming.advanced.originMixed");
  }
  if (hasDailyLog) {                 // ← correct field
    return t("dreaming.advanced.originDailyLog");
  }
  return t("dreaming.advanced.originLive");
}

The originMixed condition (grounded replay + any live support) is left unchanged as it correctly identifies entries with signals from multiple origins.

Test plan

  • An entry with only dailyCount > 0 shows "From Daily Log" badge
  • An entry with only groundedCount > 0 and no dailyCount shows "Live" badge (not "From Daily Log")
  • An entry with both groundedCount > 0 and recallCount > 0 (or dailyCount > 0) shows "Mixed" badge

Made with Cursor

Changed files

  • ui/src/ui/views/dreaming.ts (modified, +3/-2)

Code Example

const groundedEntries = props.shortTermEntries.filter((entry) => entry.groundedCount > 0);

const summary = [
  `${groundedEntries.length} ${t("dreaming.advanced.summaryFromDailyLog")}`,
  `${props.shortTermCount} ${t("dreaming.advanced.summaryWaiting")}`,
  `${props.promotedCount} ${t("dreaming.advanced.summaryPromotedToday")}`,
].join(" · ");

---

const hasGroundedReplay = entry.groundedCount > 0;
const hasLiveSupport = entry.recallCount > 0 || entry.dailyCount > 0;

if (hasGroundedReplay && hasLiveSupport) {
  return t("dreaming.advanced.originMixed");
}
if (hasGroundedReplay) {
  return t("dreaming.advanced.originDailyLog");
}
return t("dreaming.advanced.originLive");
RAW_BUFFERClick to expand / collapse

Summary

The Dreaming Advanced page appears to label and summarize grounded replay entries as "From Daily Log", which does not match the underlying short-term recall store semantics.

In my current local state:

  • dailyCount > 0: 524 entries
  • groundedCount > 0: 0 entries
  • UI shows "From Daily Log: 0"

This strongly suggests the page is using groundedCount for the "From Daily Log" summary/badges instead of dailyCount.

Reproduction / evidence

Store reality

From memory/.dreams/short-term-recall.json:

  • total entries: 635
  • entries with dailyCount > 0: 524
  • entries with groundedCount > 0: 0
  • promoted: 138
  • waiting: 497

UI behavior

On the Dreaming Advanced page, the summary shows:

  • From Daily Log: 0
  • waiting/promoted numbers are otherwise plausible

Current main-branch source evidence

In ui/src/ui/views/dreaming.ts on current main, the advanced summary uses grounded entries:

const groundedEntries = props.shortTermEntries.filter((entry) => entry.groundedCount > 0);

const summary = [
  `${groundedEntries.length} ${t("dreaming.advanced.summaryFromDailyLog")}`,
  `${props.shortTermCount} ${t("dreaming.advanced.summaryWaiting")}`,
  `${props.promotedCount} ${t("dreaming.advanced.summaryPromotedToday")}`,
].join(" · ");

And the origin label logic also maps originDailyLog from groundedCount > 0:

const hasGroundedReplay = entry.groundedCount > 0;
const hasLiveSupport = entry.recallCount > 0 || entry.dailyCount > 0;

if (hasGroundedReplay && hasLiveSupport) {
  return t("dreaming.advanced.originMixed");
}
if (hasGroundedReplay) {
  return t("dreaming.advanced.originDailyLog");
}
return t("dreaming.advanced.originLive");

The staged section is also titled "From Daily Log" while rendering groundedEntries.

Why this looks wrong

At minimum, there is a semantic mismatch:

  • If the product intends grounded replay here, the label/text appears misleading.
  • If the product intends daily-log-backed entries, then the implementation appears wrong and should probably use dailyCount > 0 instead.

Given the current UI wording, the behavior is very surprising and looks like a bug from the operator side.

Expected

One of these should be made consistent:

  1. Label semantics path

    • Rename the summary/section/badges so they clearly refer to grounded replay rather than daily-log origin.
  2. Implementation path

    • If "From Daily Log" truly means daily-log-backed entries, use dailyCount > 0 instead of groundedCount > 0 for the relevant summary / origin mapping / staged grouping.

Environment

  • Local installed OpenClaw build also shows the same logic in the packaged control-ui bundle.
  • I also verified that current GitHub main still contains the same mapping in ui/src/ui/views/dreaming.ts.

extent analysis

TL;DR

The most likely fix is to update the implementation to use dailyCount > 0 instead of groundedCount > 0 for the "From Daily Log" summary and origin mapping.

Guidance

  • Verify that the intention behind "From Daily Log" is indeed to display daily-log-backed entries, and not grounded replay entries.
  • Update the dreaming.ts file to use dailyCount > 0 for filtering entries in the summary and origin mapping, as shown in the provided code snippets.
  • Review the UI wording and labeling to ensure consistency with the updated implementation.
  • Test the changes to ensure the summary and origin mapping are correctly displaying daily-log-backed entries.

Example

const dailyEntries = props.shortTermEntries.filter((entry) => entry.dailyCount > 0);

const summary = [
  `${dailyEntries.length} ${t("dreaming.advanced.summaryFromDailyLog")}`,
  `${props.shortTermCount} ${t("dreaming.advanced.summaryWaiting")}`,
  `${props.promotedCount} ${t("dreaming.advanced.summaryPromotedToday")}`,
].join(" · ");

Notes

The provided code snippets and analysis suggest that the issue is due to a semantic mismatch between the UI labeling and the implementation. Updating the implementation to use dailyCount > 0 should resolve the issue, but it's essential to verify the intention behind the "From Daily Log" label to ensure the correct fix.

Recommendation

Apply the workaround by updating the implementation to use dailyCount > 0 instead of groundedCount > 0, as this appears to be the most straightforward fix based on the provided information.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING