fix(dashboard): restore aggregate status compatibility - #1177
Conversation
|
🦞👀 Pull request received. I will update this pull request when review starts. |
|
@clawsweeper review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
Codex review: needs maintainer review before merge. Reviewed August 16, 2026, 8:45 AM ET / 12:45 UTC. ClawSweeper reviewWhat this changesThe PR restores aggregate exact-review status through the public Worker projection, Overview, and OpenClaw Bay without re-admitting identity-bearing status data. Regression provenancePossible regression — probable (reviewed change; reproduction). No predecessor PR is attributed. Merge readinessThis PR remains necessary: current main still drops the aggregate phase objects and Priority: P2 Review scores
Verification
How this fits togetherThe dashboard Worker emits a privacy-filtered aggregate status document that cached responses, Overview, and OpenClaw Bay consume. The changed projection and client parsers determine which bounded queue aggregates survive that path and reach read-only dashboards. flowchart LR
A[Private queue status] --> B[Closed public projection]
B --> C[Cached status document]
C --> D[Overview dashboard]
C --> E[OpenClaw Bay]
B --> F[Aggregate queue counters]
F --> D
F --> E
Before merge
Agent review detailsSecurityNone. Review metrics
Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Land the narrow aggregate-only compatibility repair while retaining fixed field allowlists, bounded totals, and privacy-sentinel coverage. Do we have a high-confidence way to reproduce the issue? Yes: current-main source shows the missing object and enum admission path, while the supplied exact-head proof exercises the repeated projection and both clients with aggregate-only fixtures. Is this the best way to solve the issue? Yes: extending only the closed aggregate schema and normalizing sanitized detail is narrower and safer than weakening the privacy projection. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against d7a3ac19a833. LabelsLabel justifications:
EvidenceWhat I checked:
Likely related people:
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (4 earlier review cycles)
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
Summary
Restore the Overview and main OpenClaw Bay aggregate surfaces after the public status privacy projection made the embedded exact-review queue non-idempotent and left identity-only close rows as empty placeholders.
This is an aggregate-only compatibility hotfix. It does not restore repository, item, workflow, title, URL, query, token, credential, or failure-key identities to any public response.
Problem
The deployed
/api/statusdocument is itself passed through a second closed public projection before caching/serving and again through browser-side validation. Three naming collisions broke that path:pending,dispatching, andleasedare both closed numeric fields and aggregate phase-container names, but the generic projection admitted only the numeric form.complete, while the generic closed enum admitted onlycompleted.Bay also applied its 10,000 live-depth ceiling to bounded lifetime cumulative lane totals, even though current totals are already larger.
The direct
/api/exact-review-queueresponse remained complete while the same aggregate embedded in/api/statusbecameunknown / malformed. Overview then fell back after aRangeError; Bay rejected the aggregate status snapshot. Reverting the GitHub-throttle chart change from #1174 would not repair any of these paths. Reverting the privacy containment from #1171 would reopen its metadata exposure and still would not repair the independent durable-lifecycle over-cap state.Implementation
completeenum through both server and Overview client projectors._totalfields through the existing 1,000,000,000,000 public-status bound.closed_itemsplaceholders; retain aggregate close counts.Privacy and cardinality
pending,dispatching, andleased.Validation
Exact head:
a484445e03c5a091851f054d5fb75b10fb358079Base:
d7a3ac19a833ef019b6e0bcacb422a3d3b8544e3(main)Focused:
Exact-head Docker/browser proof:
Behavior receipt:
{"proof":"dashboard-aggregate-status-compatible","collection":"complete","handoff":{"pending":7,"dispatching":2,"leased":1},"review_enqueued_total":11120211,"publication_completed_total":11123501,"close_placeholders":0,"identity_marker_present":false}Browser receipt:
{"proof":"dashboard-browser-render","overview_fallback":false,"bay_status_unavailable":false,"active_units":28,"browser_exceptions":0,"identity_detail":"omitted","artifacts":["overview.png","overview.html","bay.html"]}The bundle contains the redacted browser receipt, Overview PNG/HTML, Bay HTML,
and local proof-server/browser logs. Its closed fixture contains aggregate counts
only. The Crabbox lease was released automatically after proof.
An earlier supplemental AWS run and local-container run passed at the first repair commit. They are superseded by the exact-head run above after review-driven follow-up changes.
Native Windows
format:checkreports checkout-wide CRLF noise across all 729 files. The Linux proof initially exposed one genuine changed-test formatting issue despite that noise; it was fixed, and the exact amended head then passed all 729 files. No repository-wide line-ending or platform-policy change is included.Real Behavior Proof
publicExactReviewQueueProjection->publicStatusProjection-> Overview and Bay client sanitizers/renderers.a484445e03c5a091851f054d5fb75b10fb358079in Docker-backed Crabboxlocal-containerrunrun_00d7872c9160, imagemcr.microsoft.com/playwright:v1.60.0-noble, leasecbx_c0197fb9b0a7.complete; handoff rendered pending/dispatching/leased counts; totals above ten million survived current and history contracts; close placeholders became an honest aggregate-only empty state; the sentinel was absent. The browser receipt recordedoverview_fallback=false,bay_status_unavailable=false,active_units=28, andbrowser_exceptions=0.Live refresh failed, restored exact-review cards and handoff phases, and displayed the aggregate-only close-detail message. Bay rendered without aggregate-status unavailable, restored its six main stages and handoff phases, and retained the GitHub-throttle chart..crabbox/runs/run_00d7872c9160/run_00d7872c9160-artifacts.tgz(212,095 bytes; SHA-256881E569ADCB6E16A8994D8D12B77F4E2D5BBED2FEAD9031627184C582FEA4DF4) and the emittedCSW-131-local-container-browser-proof-final.mdreceipt.unknown / over_capand is out of scope here.Review
public_projection_complete=true, and proves an identity-bearing close sentinel is removed.codex review --base origin/main: clean — “The patch consistently expands aggregate total bounds across queue projection, stored history, dashboard parsing, and Bay parsing, while preserving the privacy projection's idempotence.”decision=keep_open,confidence=high,action=kept_open; it made no GitHub mutation.Risks and rollback
Risk is limited to public aggregate status validation and rendering. The principal risk is admitting an unintended nested namespace; fixed allowlists, bounded values, sentinel tests, idempotence tests, and queue-boundary checks cover that path.
If this hotfix regresses the dashboard, revert this commit. Do not revert #1171 without equivalent privacy containment. No storage migration, schedule, queue, capacity, credential, or production-state change is included.
Overlap
Related investigation: CSW-131.