Skip to content

feat(triage): keep the release dashboard live and actionable - #1401

Open
karkarl wants to merge 5 commits into
mainfrom
karkarl-enhance-triage-plan-cards
Open

karkarl wants to merge 5 commits into
mainfrom
karkarl-enhance-triage-plan-cards

Conversation

@karkarl

@karkarl karkarl commented Sep 11, 2026

Copy link
Copy Markdown
Collaborator

What Problem This Solves

Resolves problems where the release-triage canvas could become stale as GitHub inventory changed, display missing reviews as a misleading zero-confidence verdict, duplicate PR cards across plan workstreams, and hide the content of independent plan steps.

Why This Change Was Made

The dashboard now reconciles live GitHub evidence with the persisted triage plan, conservatively discovers new open non-draft PRs, retains drafts and closed prerequisites when the plan still depends on them, and projects exact-head adversarial review results from the session database. Guarded actions route work to reusable child sessions without performing GitHub mutations directly.

Plan rendering now shows every step's title and detail while claiming each full PR card once. Derived plan and summary state is recomputed after review projection so cards, gates, and headline metrics remain consistent.

User Impact

Maintainers can keep one triage canvas open while PR inventory, checks, reviews, and child-session progress refresh. Missing reviews display as NO REVIEW FOUND with -% take, plan workstreams remain readable without duplicate cards, and stale or incomplete evidence cannot unlock merge routing.

Evidence

  • Current dashboard canvas reopened from the persisted release-triage input after the extension reload.
  • The Plan page shows independent step titles/details and renders each linked PR card once.
  • Exact-head adversarial review state is reflected in item cards and dependent plan status.
  • Unknown live lookups are retained conservatively but are not counted as confirmed open non-draft PRs.
  • Closed-unmerged prerequisites remain blocked and preserve enough identity to recover after reopen or merge.

Change Type

  • Bug fix
  • Feature
  • Refactor
  • Docs or instructions
  • Tests or validation
  • Security hardening
  • Chore or infrastructure

Scope

  • Tray or WinUI UX
  • Windows node capability
  • Local MCP or winnode
  • Gateway, connection, or pairing
  • Setup or onboarding
  • Permissions, privacy, or security
  • Tests, CI, or docs

Required proof pools

  • none: this changes a Copilot canvas extension and triage workflow, not a capacity-dependent Windows runtime surface.

Validation

  • node --test .github\extensions\openclaw-triage-dashboard\triage-state.test.mjs: 51 passed, 0 failed.
  • .\build.ps1: passed all five projects on Windows ARM64.
  • dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore: 3,941 passed, 34 skipped. One timing-sensitive MCP disposal test failed once, passed on an exact targeted rerun, then the complete Shared suite passed on the required full rerun.
  • dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore: 2,861 passed, 0 failed.
  • Independent code review found and drove fixes for stale review-derived plan state, closed prerequisite handling, and conservative inventory counts. The final follow-up review verified the first two fixes and found a closed-to-reopened lifecycle gap, which was fixed and covered by regression tests.
  • Structured autoreview was attempted per commit. It failed closed because Codex authentication returned HTTP 401; the UI commit also triggered the review helper's secret-like fixture safety gate. No structured-review success is claimed.

Real Behavior Proof

  • Environment tested: GitHub Copilot app on Windows ARM64, Node.js 22.19.0, .NET SDK 10.0.400.
  • PR head or commit tested: dd864a99.
  • Exact steps or command run: reloaded the project extension, reopened the persisted global-triage-2026-09-08 canvas, refreshed live GitHub and session data, and inspected the Cards and Plan surfaces.
  • Evidence after fix: the active canvas presents live PR inventory, NO REVIEW FOUND for absent review records, visible independent step text, deduplicated linked PR cards, and review-consistent plan gates.
  • Observed result: the dashboard refreshed successfully and guarded actions remained read-only with respect to GitHub mutations.
  • Screenshot or artifact links verified? (Yes/No/N/A): N/A. Current-head proof is available in the active Copilot canvas instance; the loopback canvas URL is session-local and was not published.
  • Not verified or blocked: automated structured autoreview was blocked by reviewer authentication and its secret-like-content safety gate as described above.

Security Impact

  • New permissions or capabilities? (Yes/No): No
  • Secrets or tokens handling changed? (Yes/No): No
  • New or changed network calls? (Yes/No): Yes
  • Command or tool execution surface changed? (Yes/No): No
  • Data access scope changed? (Yes/No): Yes
  • If any answer is Yes, explain the risk and mitigation: the extension performs read-only GitHub CLI lookups and reads the current session's SQLite triage tables. Loopback requests are host-bound and token-checked. GitHub mutations are not implemented in the extension; guarded actions only route a prompt to the dedicated child session, where confirmation remains required.

Compatibility and Migration

  • Backward compatible? (Yes/No): Yes
  • Config or environment changes? (Yes/No): No
  • Migration needed? (Yes/No): No
  • If yes, list the exact upgrade steps: N/A

Review Conversations

  • I replied to or resolved every bot review conversation addressed by this PR.
  • I left unresolved only conversations that still need maintainer judgment.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 7748a468-d394-45d2-b4db-1843d4483a18
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 7748a468-d394-45d2-b4db-1843d4483a18
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 7748a468-d394-45d2-b4db-1843d4483a18
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 7748a468-d394-45d2-b4db-1843d4483a18
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 7748a468-d394-45d2-b4db-1843d4483a18
@clawsweeper

clawsweeper Bot commented Sep 11, 2026

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Sep 11, 2026
@clawsweeper

clawsweeper Bot commented Sep 11, 2026

Copy link
Copy Markdown

Codex review: blocked before merge. Reviewed September 11, 2026, 2:20 PM ET / 18:20 UTC.

ClawSweeper review

What this changes

The release-triage dashboard refreshes GitHub inventory and session reviews, reconciles plan readiness, and routes actions to reusable PR sessions.

Regression provenance

Possible regression — suspected (reviewed change). No predecessor PR is attributed.

Merge readiness

Blocked before merge - 4 items remain

This remains useful work absent from current main, but two introduced browser-rendering defects prevent landing as submitted. Both have focused repairs.

Priority: P2
Reviewed head: dd864a99806498512b0a7cdfba9c9fba20c87776

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) Useful, focused subsystem work with substantial reported validation, but two concrete browser defects remain.
Proof confidence 🌊 off-meta tidepool Not applicable: The collaborator-authored PR is exempt from the external-contributor proof gate. Its captured body describes a current-head Copilot canvas refresh on Windows ARM64, but the session-local canvas was unavailable for inspection and does not demonstrate the two failing renderer scenarios.
Patch quality 🦐 gold shrimp (3/6) 2 actionable review findings remain.

Verification

Check Result Evidence
Real behavior Not applicable Not applicable: The collaborator-authored PR is exempt from the external-contributor proof gate. Its captured body describes a current-head Copilot canvas refresh on Windows ARM64, but the session-local canvas was unavailable for inspection and does not demonstrate the two failing renderer scenarios.
Evidence reviewed 8 items Introduced scope and current-main necessity: The pinned introduction contains nine dashboard and skill files. Comparing the merge base with fetched main produces no changes in these subsystems, so main still lacks this work.
Legacy rendering failure: The new renderer unconditionally calls step.gates.flatMap. The retained legacy-plan adapter creates steps without gates, and render() invokes renderPlan before rendering item cards or reviews. Existing tests inspect legacy lane construction but do not exercise this browser path.
Generated-script escape defect: renderDashboardHtml returns an ordinary template literal. The newly embedded /#(\d+)/g expression uses a single source backslash, so the emitted browser expression matches d characters instead of PR numbers. Static review rows therefore survive alongside their live replacements.
Findings 2 actionable findings [P1] Preserve rendering for legacy plan steps without gates
[P2] Escape the digit class in the generated browser script
Security None None.

How this fits together

The Copilot triage dashboard combines saved release plans, live GitHub status, and session review records into item cards and dependency gates. Its action buttons send guarded requests to child sessions; merging still requires confirmation.

flowchart TD
  A[Saved triage plan] --> D[Dashboard reconciliation]
  B[Live GitHub status] --> D
  C[Session review database] --> D
  D --> E[Item cards and plan gates]
  E --> F[Guarded action request]
  F --> G[Child session and confirmation]
Loading

Before merge

  • Preserve rendering for legacy plan steps without gates (P1) - When a saved report has an empty or omitted plan and a nonempty report.dayPlan or report.executiveQueue, buildPlanLanes() creates legacy steps without gates. This new unconditional call throws before render() reaches the item cards and review panels, breaking an existing supported input format. Default missing gates to an empty array or normalize the legacy adapter, and cover the actual renderer path.
  • Escape the digit class in the generated browser script (P2) - This regex sits inside the ordinary template literal returned by renderDashboardHtml(). Its single backslash is consumed while constructing the HTML, so the browser receives /#(d+)/g instead of a digit matcher. A static review for a numeric PR therefore remains alongside its live replacement, potentially displaying conflicting verdicts and inflating the review count. Double the source backslash and test filtering through the generated script.
  • Resolve merge risk (P1) - Existing saved reports using the legacy dayPlan/executiveQueue format can stop rendering after upgrade; the reported fresh canvas run does not establish compatibility for that path.
  • Complete next step (P2) - Fix the legacy-plan gates dereference and embedded regex escaping, then validate both generated-browser paths and rerun the required repository checks.

Findings

  • [P1] Preserve rendering for legacy plan steps without gates — .github/extensions/openclaw-triage-dashboard/triage-ui.mjs:777
  • [P2] Escape the digit class in the generated browser script — .github/extensions/openclaw-triage-dashboard/triage-ui.mjs:907-909
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Production and test growth Production +690 net lines; tests +623 net lines The stated live reconciliation and review-display features explain the production growth, but browser execution remains a gap in the added coverage.

Merge-risk options

Maintainer options:

  1. Preserve legacy dashboard inputs (recommended)
    Repair the missing-gates assumption and generated regex, then verify older saved reports and mixed static/live reviews before landing.
Copy recommended automerge instruction
@clawsweeper automerge

Special instructions:
Preserve legacy plan rendering when gates is absent, correct the PR-number regex escaping inside the generated HTML, and add behavioral regression coverage for both generated-browser paths without changing action authorization.

Technical review

Best possible solution:

Preserve legacy saved reports while presenting one current review per PR, with regression coverage that exercises the generated browser script.

Do we have a high-confidence way to reproduce the issue?

Yes, by source inspection: a legacy report with no structured plan reaches an undefined gates dereference, and a static review sharing a PR number with a live review is not filtered by the emitted regex. These paths were not executed.

Is this the best way to solve the issue?

The overall approach fits the existing dashboard, but the implementation needs two local renderer repairs and behavioral coverage of generated JavaScript.

Full review comments:

  • [P1] Preserve rendering for legacy plan steps without gates — .github/extensions/openclaw-triage-dashboard/triage-ui.mjs:777
    When a saved report has an empty or omitted plan and a nonempty report.dayPlan or report.executiveQueue, buildPlanLanes() creates legacy steps without gates. This new unconditional call throws before render() reaches the item cards and review panels, breaking an existing supported input format. Default missing gates to an empty array or normalize the legacy adapter, and cover the actual renderer path.
    Confidence: 0.99
  • [P2] Escape the digit class in the generated browser script — .github/extensions/openclaw-triage-dashboard/triage-ui.mjs:907-909
    This regex sits inside the ordinary template literal returned by renderDashboardHtml(). Its single backslash is consumed while constructing the HTML, so the browser receives /#(d+)/g instead of a digit matcher. A static review for a numeric PR therefore remains alongside its live replacement, potentially displaying conflicting verdicts and inflating the review count. Double the source backslash and test filtering through the generated script.
    Confidence: 0.99

Overall correctness: patch is incorrect
Overall confidence: 0.98

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against c71121cdcdc9.

Labels

Label changes:

  • add P2: This is a bounded maintainer-tooling improvement with repairable rendering defects.
  • add merge-risk: 🚨 compatibility: The introduced gates dereference breaks the still-supported legacy saved-plan format.
  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🌊 off-meta tidepool and patch quality is 🦐 gold shrimp.
  • add status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: The collaborator-authored PR is exempt from the external-contributor proof gate. Its captured body describes a current-head Copilot canvas refresh on Windows ARM64, but the session-local canvas was unavailable for inspection and does not demonstrate the two failing renderer scenarios.

Label justifications:

  • P2: This is a bounded maintainer-tooling improvement with repairable rendering defects.
  • merge-risk: 🚨 compatibility: The introduced gates dereference breaks the still-supported legacy saved-plan format.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🌊 off-meta tidepool and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: The collaborator-authored PR is exempt from the external-contributor proof gate. Its captured body describes a current-head Copilot canvas refresh on Windows ARM64, but the session-local canvas was unavailable for inspection and does not demonstrate the two failing renderer scenarios.

Evidence

Acceptance criteria:

  • [P1] node --test .github/extensions/openclaw-triage-dashboard/triage-state.test.mjs.
  • [P1] ./build.ps1.
  • [P1] dotnet test ./tests/OpenClaw.Shared.Tests/OpenClaw.Shared.Tests.csproj --no-restore.
  • [P1] dotnet test ./tests/OpenClaw.Tray.Tests/OpenClaw.Tray.Tests.csproj --no-restore.
  • [P1] Exercise generated-browser rendering with legacy plan input and matching static/live review records; confirm all panels render and review rows are deduplicated.

What I checked:

Likely related people:

  • Karen: Raw commit 5a3c997 adds .github/extensions/openclaw-triage-dashboard/triage-plan.mjs:10 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 5a3c997c2560; files: .github/extensions/openclaw-triage-dashboard/triage-plan.mjs)
  • shanselman: Suggested for follow-up; no historical authorship or introduction is verified. (role: unverified routing candidate; confidence: low)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Repair legacy-plan rendering and verify an older saved report still renders all dashboard panels.
  • Correct the embedded regex and verify a live review replaces the corresponding static review in the generated browser code.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P2 Normal priority bug or improvement with limited blast radius. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant