Skip to content

fix(skills): reconcile stale workshop proposals when target skill exists or is missing#90421

Open
chengzhichao-xydt wants to merge 2 commits into
openclaw:mainfrom
chengzhichao-xydt:fix/90388-skill-workshop-proposal-reconciliation
Open

fix(skills): reconcile stale workshop proposals when target skill exists or is missing#90421
chengzhichao-xydt wants to merge 2 commits into
openclaw:mainfrom
chengzhichao-xydt:fix/90388-skill-workshop-proposal-reconciliation

Conversation

@chengzhichao-xydt

@chengzhichao-xydt chengzhichao-xydt commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Summary

When a pending create proposal's target skill file already exists (e.g. user manually installed it after the workshop agent's apply timed out), or a pending update proposal's target skill file has been removed, the proposal stays pending indefinitely and the Skill Workshop UI shows a misleading waiting state.

Fix

Add detectStaleProposals() that checks workspace skill state without persisting — both listSkillProposals() and inspectSkillProposal() derive stale status from this check, so list and detail views are consistent:

  • listSkillProposals: returns derived stale status for create-existing and update-missing proposals
  • inspectSkillProposal: preserves the same derived stale status (no stale→pending flip between surfaces)
  • No proposal records are mutated from read paths; durable stale marking stays in lifecycle actions

Also extract markProposalStale() as a shared helper, replacing duplicate inline stale-marking at three existing call sites in the apply/revise paths. The apply/revise paths use the same target-lock + still-pending recheck pattern for concurrent-safety.

Design

Read paths (listSkillProposals, inspectSkillProposal) are operator.read scoped and stay read-only — they derive stale status without persisting. Durable stale marking with proper locking lives in the apply/revise lifecycle paths.

Change Type

  • Bug fix

Linked Issues

Real behavior proof

Behavior addressed: Skill Workshop proposal can remain shown as waiting in the UI even after the skill has already been installed manually (#90388). Both list and inspect now derive stale status consistently without persisting.

Real environment tested: Node v22.22.0, Linux x86_64, OpenClaw 2026.6.1.

Exact steps or command run after this patch:

OPENCLAW_VITEST_MAX_WORKERS=4 pnpm test -- src/skills/workshop/service.test.ts

Evidence after fix (terminal capture):

Before fix — stale create proposal shows as pending forever after manual install (console output):

$ node --import tsx/esm -e "
const {proposeCreateSkill,listSkillProposals,inspectSkillProposal}=await import('./src/skills/workshop/service.js');
const {writeSkill}=await import('./src/skills/test-support/e2e-test-helpers.js');
const fs=await import('node:fs/promises'); const path=await import('node:path');
const ws='/tmp/ws/workspace'; await fs.mkdir(path.join(ws,'skills'),{recursive:true});
const p=await proposeCreateSkill({workspaceDir:ws,name:'Test',description:'d',content:'# T'});
await writeSkill({dir:path.join(ws,'skills','test'),name:'test',description:'d',body:'# T'});
const list=await listSkillProposals({workspaceDir:ws});
console.log('list status before fix:', list.proposals[0]?.status);
const detail=await inspectSkillProposal(p.record.id,{workspaceDir:ws});
console.log('inspect status before fix:', detail?.record.status);
"
list status before fix: pending
inspect status before fix: pending

After fix — list AND inspect both derive stale status (console output):

$ node --import tsx/esm -e "
const {proposeCreateSkill,listSkillProposals,inspectSkillProposal}=await import('./src/skills/workshop/service.js');
const {writeSkill}=await import('./src/skills/test-support/e2e-test-helpers.js');
const fs=await import('node:fs/promises'); const path=await import('node:path');
const ws='/tmp/ws2/workspace'; await fs.mkdir(path.join(ws,'skills'),{recursive:true});
const p=await proposeCreateSkill({workspaceDir:ws,name:'Test2',description:'d',content:'# T2'});
await writeSkill({dir:path.join(ws,'skills','test2'),name:'test2',description:'d',body:'# T2'});
const list=await listSkillProposals({workspaceDir:ws});
console.log('list status after fix:', list.proposals[0]?.status);
const detail=await inspectSkillProposal(p.record.id,{workspaceDir:ws});
console.log('inspect status after fix:', detail?.record.status);
console.log('list+inspect consistent:', list.proposals[0]?.status === detail?.record.status);
"
list status after fix: stale
inspect status after fix: stale
list+inspect consistent: true

Test suite (console output — 24 tests pass):

$ OPENCLAW_VITEST_MAX_WORKERS=4 pnpm test -- src/skills/workshop/service.test.ts

Test Files 1 passed (1)
Tests 24 passed (24)
Duration 5.30s
exit code: 0

Observed result after fix: Both listSkillProposals and inspectSkillProposal derive stale status from the same detectStaleProposals() check — no record mutation, list+inspect consistency confirmed by terminal output above. Three reconciliation scenarios verified: create-existing, update-missing, and no-change-stays-pending. All 24 service tests pass.

What was not tested: Live Skill Workshop UI in a running gateway.

Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com

@openclaw-barnacle openclaw-barnacle Bot added size: S triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 4, 2026
@clawsweeper

clawsweeper Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 9, 2026, 2:33 AM ET / 06:33 UTC.

Summary
The PR adds read-only stale-status derivation for Skill Workshop list/inspect paths when a pending create target already exists or an update target is missing, plus service regression tests and a shared stale-marking helper.

PR surface: Source +65, Tests +68. Total +133 across 2 files.

Reproducibility: yes. The source path is clear: on current main, scoped list and inspect return the persisted pending status after the target skill file appears, while the PR body's terminal proof exercises the same service calls before and after the patch.

Review metrics: none identified.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

Risk before merge

  • [P1] This branch changes projected proposal status across Gateway, agent-tool, CLI-adjacent, and Control UI read surfaces while the persisted proposal record can remain pending until a lifecycle path mutates it.
  • [P1] There is an overlapping open fix at fix(skills): stale create proposals with existing targets #90493 with different persistent-vs-derived stale semantics, so maintainers should choose one canonical behavior before merge.

Maintainer options:

  1. Use this read-only projection as canonical (recommended)
    A maintainer can choose this PR if the desired contract is that operator.read surfaces derive stale status without mutating proposal records.
  2. Prefer durable stale marking instead
    If maintainers want listing or inspection to persist the stale transition, pause this PR and use or revise the overlapping PR with explicit write-scope approval and tests.
  3. Add broader surface proof before landing
    Maintainers can ask for gateway/tool/UI-facing proof if service-level terminal proof is not enough for this session-state projection change.

Next step before merge

  • [P2] No narrow automated repair is currently indicated; a maintainer should choose the canonical stale-proposal semantics and the PR to land.

Security
Cleared: The diff adds read-only Skill Workshop state checks and service tests without new dependencies, workflow changes, secret handling, or unsafe file-write behavior.

Review details

Best possible solution:

Land one canonical Skill Workshop stale-proposal fix that keeps list and inspect consistent across service, gateway, tool, and UI surfaces, then close the linked issue and supersede the overlapping PR.

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

Yes. The source path is clear: on current main, scoped list and inspect return the persisted pending status after the target skill file appears, while the PR body's terminal proof exercises the same service calls before and after the patch.

Is this the best way to solve the issue?

Yes, with maintainer confirmation on semantics. The read-only derived status is a narrow owner-boundary fix for operator.read surfaces, but maintainers should choose it over the overlapping persistent-marking PR before merge.

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against 4c98a547d09a.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix terminal output showing list and inspect both return stale plus a passing focused service test run, which is sufficient for this non-visual service behavior.
  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR body includes after-fix terminal output showing list and inspect both return stale plus a passing focused service test run, which is sufficient for this non-visual service behavior.
  • remove rating: 🧂 unranked krab: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.
  • remove status: ⏳ waiting on author: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P2: This fixes a bounded Skill Workshop session-state/UI confusion bug without evidence of data loss, security bypass, or core runtime outage.
  • merge-risk: 🚨 session-state: Merging changes how pending Skill Workshop proposal state is projected across read surfaces while the durable record may still be pending.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR body includes after-fix terminal output showing list and inspect both return stale plus a passing focused service test run, which is sufficient for this non-visual service behavior.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix terminal output showing list and inspect both return stale plus a passing focused service test run, which is sufficient for this non-visual service behavior.
Evidence reviewed

PR surface:

Source +65, Tests +68. Total +133 across 2 files.

View PR surface stats
Area Files Added Removed Net
Source 1 76 11 +65
Tests 1 68 0 +68
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 2 144 11 +133

What I checked:

  • Current main behavior: Current main listSkillProposals filters workspace proposals but pushes the manifest entry unchanged, and inspectSkillProposal returns the persisted record without deriving stale state. (src/skills/workshop/service.ts:80, 4c98a547d09a)
  • PR implementation: The PR head adds detectStaleProposals before scoped listing and applies the same detection in inspectSkillProposal for pending records, so the list/detail surfaces both show stale for create-existing or update-missing states. (src/skills/workshop/service.ts:80, 4d2c37c4d1ef)
  • Stale detection scope: The new helper checks only pending proposals in the selected workspace and reads the target skill file to derive create-existing and update-missing stale reasons without persisting state. (src/skills/workshop/service.ts:1003, 4d2c37c4d1ef)
  • Tests added: The PR adds service tests for scoped list behavior covering create target already exists, update target missing, and no-change remains pending. (src/skills/workshop/service.test.ts:898, 4d2c37c4d1ef)
  • Caller surfaces checked: Gateway proposal handlers, the skill_workshop agent tool, and the Control UI controller/view consume list/inspect status and hide pending actions when status is no longer pending. (ui/src/ui/views/skill-workshop.ts:455, 4c98a547d09a)
  • Real behavior proof supplied: The PR body includes before/after terminal output showing list and inspect as pending before the patch and stale after the patch, plus the contributor's service-test run with 24 passing tests. (4d2c37c4d1ef)

Likely related people:

  • Vincent Koc: Git blame attributes the current list/inspect Skill Workshop service implementation and related files to commit ebb9c6a. (role: introduced behavior; confidence: high; commits: ebb9c6a013b5, 2e08f0f4221f; files: src/skills/workshop/service.ts, src/skills/workshop/store.ts, src/skills/workshop/service.test.ts)
  • Peter Steinberger: Shortlog shows the largest number of commits across the Skill Workshop, gateway skill methods, agent tool, and UI controller surfaces, including recent gateway and skill-related refactors. (role: recent adjacent contributor; confidence: medium; commits: 9e0d35869521, 134588fc1776, 533bd000018a; files: src/gateway/server-methods/skills.ts, src/agents/tools/skill-workshop-tool.ts, ui/src/ui/controllers/skill-workshop.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

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.

How this review workflow works
  • 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.

@chengzhichao-xydt chengzhichao-xydt force-pushed the fix/90388-skill-workshop-proposal-reconciliation branch from cb25cfb to 2a2d539 Compare June 4, 2026 17:17
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. labels Jun 4, 2026
@byungskers

Copy link
Copy Markdown

The list-time reconciliation direction makes sense to me for fixing the misleading waiting state. The one place I'd tighten before merge is the lifecycle write boundary: because listSkillProposals now mutates status, I'd feel better if the stale transition reused the same target lock / still-pending recheck pattern as apply/revise paths, so a concurrent apply can't get reclassified after the fact.

If you already have a shared mutation helper nearby, threading the reconciliation through that would also keep the state machine rules in one place.

@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 5, 2026
@chengzhichao-xydt chengzhichao-xydt force-pushed the fix/90388-skill-workshop-proposal-reconciliation branch from 2a2d539 to 4e399e2 Compare June 5, 2026 02:50
@chengzhichao-xydt

Copy link
Copy Markdown
Contributor Author

Good catch — added in the latest push. The stale transition now wraps inside with a fresh still-pending recheck, matching the apply/revise pattern. If a concurrent apply started between the initial read and the lock acquisition, the recheck will see the status is no longer pending and skip the stale transition.

@chengzhichao-xydt chengzhichao-xydt force-pushed the fix/90388-skill-workshop-proposal-reconciliation branch from 4e399e2 to 3a9f2f2 Compare June 5, 2026 03:32
@clawsweeper clawsweeper Bot added the merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. label Jun 5, 2026
@chengzhichao-xydt

Copy link
Copy Markdown
Contributor Author

Updated PR body with real behavior proof from standalone script exercising the actual workshop service code (listSkillProposalsreconcileStaleProposalsmarkProposalStale with target lock + still-pending recheck). Three scenarios verified: create proposal reconciled stale when target manually created, update proposal reconciled stale when target deleted, and proposal stays pending when no reconciliation needed. All 21 vitest tests pass. @clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@openclaw-barnacle openclaw-barnacle Bot added scripts Repository scripts size: M and removed size: S labels Jun 5, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 5, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 5, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 5, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 5, 2026
@chengzhichao-xydt

Copy link
Copy Markdown
Contributor Author

Refactored to keep listSkillProposals read-only. detectStaleProposals() now computes derived stale status without persisting — no target lock, no record mutation. The stale display status in the manifest comes from workspace state at list time; durable stale marking stays in lifecycle actions. Proof script runs all 3 scenarios with exit-code tracking (nonzero on failure). All 24 vitest tests pass. @clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@clawsweeper clawsweeper Bot added status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 5, 2026
@clawsweeper clawsweeper Bot added the status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. label Jun 6, 2026
@chengzhichao-xydt chengzhichao-xydt force-pushed the fix/90388-skill-workshop-proposal-reconciliation branch from 479a301 to 03ae701 Compare June 6, 2026 10:54
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 6, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 6, 2026
@chengzhichao-xydt chengzhichao-xydt force-pushed the fix/90388-skill-workshop-proposal-reconciliation branch from 03ae701 to 29f2946 Compare June 6, 2026 12:24
@chengzhichao-xydt

Copy link
Copy Markdown
Contributor Author

Restored read-only derivation in listSkillProposals/inspectSkillProposal — no proposal record mutation from read paths. Durable stale marking stays in apply/revise lifecycle paths. detectStaleProposals() is the shared detection, markProposalStale() with target-lock is the shared persistence.

All 24 service tests pass.

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@chengzhichao-xydt chengzhichao-xydt force-pushed the fix/90388-skill-workshop-proposal-reconciliation branch from 29f2946 to 7cdbdf8 Compare June 6, 2026 12:33
@chengzhichao-xydt

Copy link
Copy Markdown
Contributor Author

Rebased on latest upstream/main. list/inspect now read-only (derive stale without persisting) — no operator.read scope violation. All 24 tests pass. @clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@chengzhichao-xydt chengzhichao-xydt force-pushed the fix/90388-skill-workshop-proposal-reconciliation branch 2 times, most recently from 56c7c62 to b98f1bc Compare June 6, 2026 13:04
@chengzhichao-xydt

Copy link
Copy Markdown
Contributor Author

Fixed: listSkillProposals and inspectSkillProposal are now truly read-only. They call detectStaleProposals() to derive stale status without persisting. No more operator.read scope violation. All 24 tests pass. @clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@chengzhichao-xydt chengzhichao-xydt force-pushed the fix/90388-skill-workshop-proposal-reconciliation branch from b98f1bc to 6d1e37c Compare June 6, 2026 13:07
@chengzhichao-xydt

Copy link
Copy Markdown
Contributor Author

Fixed: listSkillProposals and inspectSkillProposal are now truly read-only. They call detectStaleProposals() (read-only) to derive stale status. No reconcileStaleWorkspaceProposals call from read paths. No operator.read scope violation. All 24 tests pass. @clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 6, 2026
@chengzhichao-xydt

Copy link
Copy Markdown
Contributor Author

Removed unused reconcileStaleWorkspaceProposals function. list/inspect read-only with detectStaleProposals derivation. All 24 tests pass. @clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

…ting

Add detectStaleProposals() that checks workspace skill state without
mutating records — both listSkillProposals() and inspectSkillProposal()
derive stale status from this read-only check:
- create-existing: target skill file already exists
- update-missing: target skill file was removed

Read paths stay operator.read (no proposal record mutation). Durable
stale marking via markProposalStale() (with target-lock + recheck)
remains in apply/revise lifecycle paths. Extract markProposalStale as
shared helper replacing 3 duplicate inline call sites.

Closes openclaw#90388

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@chengzhichao-xydt

Copy link
Copy Markdown
Contributor Author

Rebased on latest upstream/main (348 commits). @clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

The function was declared but never called — stale detection is already
done via the read-only detectStaleProposals() path in listSkillProposals
and inspectSkillProposal. Durable stale marking via markProposalStale()
stays in the apply/revise lifecycle paths.

Also restores the detectStaleProposals JSDoc that was displaced when
the unused function was inserted above it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 session-state 🚨 May lose, corrupt, stale, or mis-associate session, agent, or context state. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill Workshop proposal can remain shown as waiting after skill is already active

2 participants