feat(telemetry): accept identifier-free update outcomes - #23
roboclaw-bot wants to merge 4 commits into
Conversation
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com> Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com> Co-authored-by: steipete <58493+steipete@users.noreply.github.com> OpenClaw-Publication: 6f22cf3b-82c5-4ca7-9d1c-c79f01c7dbd7
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: blocked before merge. Reviewed September 23, 2026, 6:26 PM ET / 22:26 UTC (Revision 3). ClawSweeper reviewWhat this changesThe branch adds a strictly validated update-outcome request to the telemetry Worker, a capability check, separate analytics storage, documentation, and runtime coverage. Merge readiness⛔ Blocked before merge - 4 items remain Current main does not accept update outcomes. The revised PR addresses the prior quota and deployment-binding findings and has relevant local Worker HTTP proof. It remains draft while the default-on policy and coordinated rollout need maintainer confirmation. Priority: P2 Review scores
Verification
How this fits togetherThe telemetry Worker receives OpenClaw update checks and returns the latest version. This branch lets it route bounded update outcomes to a separate dataset while keeping daily telemetry on its existing path. flowchart LR
A[Update client] --> B[Latest-version endpoint]
B --> C{Request type}
C -->|HEAD| D[Outcome capability response]
C -->|Daily check| E[Daily telemetry dataset]
C -->|Valid outcome| F[Separate outcome dataset]
B --> G[Latest-version answer]
Decision needed
Why: The staging boundary is technically explicit, but activation and the reported default-on policy require an accountable maintainer decision. Before merge
Agent review detailsSecurityNone. Review metrics
Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Confirm the collection policy, land the receiver in its unbound state if approved, and verify dataset delivery and retention before releasing the paired default-on client. Do we have a high-confidence way to reproduce the issue? Not applicable to the feature request. The prior quota regression has a concrete unfinished-upload scenario in the committed local HTTP harness. Is this the best way to solve the issue? Yes for the receiver boundary: strict labels, a separate dataset, and an unbound default deployment limit collection. The release sequence and default-on policy still need confirmation. AGENTS.md: not found in the target repository. Codex review notes: model internal, reasoning medium; reviewed against 1d9ff5c35e71. LabelsLabel changes: No label changes. Label justifications:
EvidenceWhat I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (2 earlier review cycles)
|
Accept bounded extended-stable patch versions in all four outcome fields. Clarify update-policy controls and require receiver readiness before releasing the default-on client. Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com> Co-authored-by: steipete <58493+steipete@users.noreply.github.com>
Merge pinned upstream main 1d9ff5c, preserving its compiled vocabulary and refreshed Worker tooling. Check GET/POST recording quota once before reading an upload. Add the no-side-effect HEAD capability handshake and keep UPDATE_RESULTS out of automatic production deployment pending separately authorized rollout. Document default-on update policy, strict wire shape, and two-request attempts; verify bounded unfinished streams and real local workerd HTTP. Co-authored-by: fuller-stack-dev <263060202+fuller-stack-dev@users.noreply.github.com> Co-authored-by: steipete <58493+steipete@users.noreply.github.com> Co-authored-by: vincentkoc <25068+vincentkoc@users.noreply.github.com>
Summary
Add the receiver companion for identifier-free terminal update outcomes on the existing
POST /api/latest-versionendpoint. Finalization only: no merge, deployment, production outcome requests, provisioning, paid resources, or credential changes.update_result: 18 mandatory flat public-label fields; no IDs, geography, raw User-Agent, logs, private versions or free-form diagnostics. Valid UTF-8 and at most 4096 upload bytes, including BOM/whitespace. Fixed UAopenclaw-update-result/1keeps malformed outcomes off the daily path. Dedicated outcome storage never falls back toTELEMETRY.UPDATE_RESULTSfrom default production Wrangler configuration. It now exactly matches current main's bindings (TELEMETRYandRATE_LIMIT); the existing main-push deployment workflow is unchanged. A separately authorized rollout must explicitly supply the separate dataset binding and verify delivery/retention.OpenClaw-Update-Results: 2; absent → empty 503 without capability header. Both useCache-Control: no-store. HEAD never reads an upload/geography, consumes recording quota, writes analytics, or fetches a version. Presence is capability, not production-readiness proof.DO_NOT_TRACKaffects feature statistics, not update checks/outcomes. The paired client is being finalized to the same contract; receiver disclosure is not being changed back to separate opt-in.2026.8.33and2026.8.123; year/month/revision/beta restrictions remain unchanged.Verification — exact receiver head
Tested/published candidate:
d7c2aac798816662e6144e514b873aa7916ce504. Forward-only merge of previous head20e22a5f5c1c5c984700b589215369d448969fefand pinned upstream main1d9ff5c35e71f33b75428579015541d08fbd2c52. Resolved the handler conflict while preserving main's compiled-vocabulary simplification and refreshed tooling/lockfile. No force push or replacement of others' changes.npm run check: deterministic vocabulary + TypeScript + 13 files / 492 tests passed. Includes 79 outcome tests and 9 pinned-workerd runtime tests.scoped-clean/ no actionable findings. Static review is separate from executed runtime proof.npx wrangler deploy --dry-run, Wrangler 4.136.3: passed, no deployment. Output lists onlyenv.TELEMETRY (openclaw_telemetry)andenv.RATE_LIMIT (20 requests/60s); no UPDATE_RESULTS binding.2eb0cffc863c8b3b5335ffcc0a38bcc8495264e8c988647419b328fce0dba754, 18 fields. Storage columns unchanged.Real behavior proof (local HTTP, not production)
Executed the actual bundled Worker in Wrangler's pinned workerd runtime, using loopback HTTP, synthetic fixtures, isolated sinks and a stubbed npm response. Committed harness: test/latest-version-runtime.test.mjs.
20e22a5, exhausted quota, unfinished chunked POST, both outcome and legacy UA1d9ff5c, same unfinished uploadsd7c2aac, same unfinished uploadsupdate_results_unavailable; no daily fallback or upstream fetchinvalid_update_result; neither dataset receives a rowThe initial new Node HTTP harness accidentally used the host environment-proxy global agent; this produced a non-JSON proxy error instead of reaching loopback. The harness now uses an explicit local HTTP Agent and closes/rejects on failures. The focused 9-test runtime suite and full 492-test suite then passed; no product assertions or deadlines were weakened.
Remaining rollout and coordination
Receiver source is prepared for coordinated merge readiness; this PR remains draft until both PRs and exact-head CI are checked together. No ready transition, merge or deployment was performed here. Production dataset provisioning/delivery and SQL remain unverified and separately authorized work. HEAD is not a storage health check. Version-response failure may follow recording; no exactly-once or retry guarantee. Without the fixed UA, undecodable bodies retain legacy invalid-feature behavior; companion clients must always send it.
The existing public fork remains owned/published by the same managed identity
roboclaw-bot; no alternate credentials or upstream branch writes.Contributor credit: Json (@fuller-stack-dev), Peter (@steipete), and Vincent (@vincentkoc).
Work sessions
View the OpenClaw team session