Skip to content

fix: repair orphaned pending skill versions stuck after publish - #3401

Open
trippyogi wants to merge 17 commits into
openclaw:mainfrom
trippyogi:fix/3349-publish-version-projection
Open

fix: repair orphaned pending skill versions stuck after publish#3401
trippyogi wants to merge 17 commits into
openclaw:mainfrom
trippyogi:fix/3349-publish-version-projection

Conversation

@trippyogi

Copy link
Copy Markdown

Closes #3349

Related: #3353 (scanner retry cap only — explicitly not this defect)

What Problem This Solves

Fixes an issue where clawhub skill publish could report success and reserve a version while that version never appeared in latest, the version index, or tag pointers. Publishers then hit a dead end: metadata reads 404, files remain fetchable by explicit version, and republish is rejected as a duplicate.

Why This Change Was Made

Staged skill publish inserts a pending skillVersion first and only projects it onto the skill document during async finalization. If finalization never completes, the version stays orphaned forever.

This change:

  • Caps consecutive transient finalization failures so attempts surface as failed instead of looping forever
  • Adds an admin-gated repair path (maintenance:repairOrphanedPendingSkillVersion + sweep) that re-runs finalization from the version's captured insert args, refuses while a live attempt still owns the version, and force-closes the original attempt afterward
  • Surfaces pending / blocked / stuck-failed publication state to authenticated owners (including org publisher scope) instead of a bare 404, without leaking existence to other callers

Non-goals: does not change the normal happy-path publish projection; does not auto-run repair in production without an operator.

User Impact

  • Owners of stuck pending versions get a clear diagnostic (423 in-flight, 409 after terminal finalize failure) instead of a silent 404
  • Operators can repair orphaned pending versions without deleting the skill or forcing a version bump
  • Publishers are less likely to be permanently blocked by a half-written publish

Evidence

Focused tests (local):

  • bunx vitest run convex/httpApiV1.handlers.test.ts -t "3349" — 5 passed
  • bunx vitest run convex/publishAttempts.test.ts -t "findActiveSkillPublishAttempt|3349|orphaned|finalizationFailure|scanner retries" — 11 passed

Bugbot (branch vs main): fixed findings before draft —

  1. Org publisher owners missed pending diagnostic → publisher-scope auth
  2. Terminal-failed finalize still said "re-check shortly" → 409 + repair hint
  3. checkFailureCount treated as abandoned → only finalizationFailureCount abandons grace (scanner retries stay live)

Note: #3353 merged earlier and bounds prepublication scanner retries; it does not close #3349 (called out in that PR body as a separate post-finalization consistency defect).

@vercel

vercel Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

@trippyogi is attempting to deploy a commit to the OpenClaw Foundation Team on Vercel.

A member of the Team first needs to authorize it.

trippyogi added a commit to trippyogi/clawhub that referenced this pull request Aug 4, 2026
…air flow

- releaseFinalizationClaimPatch (publishAttempts.ts) now caps
  consecutive finalization failures only for kind==="skill". Package
  attempts have no repair path yet, so they retry unbounded instead of
  becoming a permanent orphan.

- isActiveAttemptLive (publishAttempts.ts) no longer abandons a
  non-terminal attempt just because finalizationFailureCount > 0. It
  now checks staleness against updatedAt (falling back to createdAt)
  using ACTIVE_ATTEMPT_RETRYABLE_STALE_MS for attempts with retry
  activity, or ACTIVE_ATTEMPT_UNCLAIMED_GRACE_MS for zero-failure
  attempts, so a below-cap dispatcher retry (or a long pending_checks
  phase that just transitioned cleanly) is not raced by manual repair.
  Added findActiveSkillPublishAttemptByIdInternal so the repair
  pre-check can look up a known publishAttemptId directly instead of
  only scanning by slug/version.

- repairOrphanedPendingSkillVersionHandler (maintenance.ts) now
  publishes the pending version and closes the orphaned attempt
  atomically via a new publishPendingVersionAndCloseAttemptInternal
  mutation (skills.ts), closing before follow-ups are scheduled. This
  removes the publish-before-close race where a crash between publish
  and close left the version published but the attempt reclaimable.
  Also handles the already-published-but-still-open-attempt retry
  case as an attempt-cleanup path.

- skillsGetRouterV1Handler exact-version path (skillsV1.ts) falls back
  to an owner-visible pending-publication diagnostic via
  getSkillBySlugInternal + describeOwnerVisibleSkillVersionState when
  the public getBySlug lookup misses entirely, so a brand-new hidden
  skill (pending its first publish) no longer 404s for its owner.

Tests added/updated in publishAttempts.test.ts, maintenance.test.ts,
and httpApiV1.handlers.test.ts for all four findings.
@trippyogi
trippyogi marked this pull request as ready for review August 4, 2026 21:57
@trippyogi
trippyogi requested review from a team and Patrick-Erichsen as code owners August 4, 2026 21:57
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. 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: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. labels Aug 5, 2026
@clawsweeper

clawsweeper Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed August 6, 2026, 7:37 PM ET / 23:37 UTC.

ClawSweeper review

What this changes

This PR bounds repeated skill-finalization failures, adds admin-only recovery for stranded pending versions, and gives authorized owners useful pending-publication diagnostics.

Regression provenance

Possible regression — probable (reproduction; reviewed change). No predecessor PR is attributed.

Merge readiness

Blocked until stronger real behavior proof is added - 4 items remain

Keep open. The repair design is coherent and no blocking code defect was found, but the claimed deployment run is not attached as an inspectable trace, so real after-fix behavior proof is still required before merge.

Priority: P1
Reviewed head: 778ecf691de071db67c686c3ce32c3153031820d

Review scores

Measure Result What it means
Overall readiness 🦪 silver shellfish (2/6) The patch has substantial focused coverage and no confirmed code finding, but inspectable real behavior proof remains a merge gate.
Proof confidence 🦪 silver shellfish (2/6) Needs stronger real behavior proof before merge: The contributor describes a throwaway Convex deployment and after-fix results, but the cited proof pack or redacted request/response trace is not directly inspectable; attach it and update the PR body for re-review.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Verification

Check Result Evidence
Real behavior Needs proof Needs stronger real behavior proof before merge: The contributor describes a throwaway Convex deployment and after-fix results, but the cited proof pack or redacted request/response trace is not directly inspectable; attach it and update the PR body for re-review.
Evidence reviewed 5 items Current publish boundary: Current main stages a version and later runs deferred enrichment plus the projection mutation; an error before that mutation can leave the staged version pending.
Atomic repair path: The PR rechecks attempt eligibility inside the mutation, publishes the pending version, schedules security follow-ups, closes the attempt, and clears staged data transactionally.
Repair security gate: The PR permits recovery only for attempts with clean pre-publication checks and refuses active attempt ownership.
Findings None None.
Security None None.

How this fits together

Skill publishing stages a version, runs checks, then finalizes it into the public skill index and latest pointers. This change handles versions left pending when finalization repeatedly fails and controls how an operator can safely complete that projection.

flowchart LR
  A[Skill publish] --> B[Pending version]
  B --> C[Pre-publication checks]
  C --> D[Finalization worker]
  D --> E{Finalized?}
  E -->|Yes| F[Public skill index]
  E -->|Repeated failure| G[Admin repair]
  G --> F
  F --> H[Version and install reads]
Loading

Before merge

  • Add real behavior proof - Needs stronger real behavior proof before merge: The contributor describes a throwaway Convex deployment and after-fix results, but the cited proof pack or redacted request/response trace is not directly inspectable; attach it and update the PR body for re-review.
  • Resolve merge risk (P1) - After five transient finalization failures, an existing publish now stops retrying and requires an administrator repair rather than continuing indefinitely.
  • Resolve merge risk (P1) - The recovery path republishes persisted data and schedules security scans, so a real trace should demonstrate both successful projection and exactly the expected follow-up work.
  • Complete next step (P2) - The contributor needs to provide inspectable real deployment evidence; no narrow mechanical repair task remains from this review.
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Production and test delta production +1,282/-244; tests +2,242/-0 The repair is heavily regression-tested, but it changes several coupled publish, HTTP, and maintenance paths.
Files affected 11 files The change spans finalization, persistent attempts, owner diagnostics, operator tooling, and its governing invariant.

Root-cause cluster

Relationship: fixed_by_candidate
Canonical: #3349
Summary: This PR is the concrete candidate repair for the canonical pending-version projection failure.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge-risk options

Maintainer options:

  1. Attach inspectable recovery proof (recommended)
    Before merge, add a redacted terminal or HTTP trace from a real Convex deployment showing capped failure, successful repair, public version visibility, and the scheduled scan follow-ups.
  2. Accept manual recovery after the cap
    Maintainers may explicitly accept that a transient failure beyond the cap pauses publishing until an administrator performs the guarded repair.

Technical review

Best possible solution:

Keep the staged workflow, merge the bounded operator recovery only after a redacted real deployment trace proves terminal failure, repair, public visibility, and security follow-up scheduling.

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

Yes, source reproducible: current main separates pending-version creation from deferred finalization, and the reported live record matches that boundary; I did not independently run the failure against a deployment.

Is this the best way to solve the issue?

Yes, as a bounded recovery solution: it reuses captured publish inputs, requires completed checks, and closes the repair race atomically, but it still needs directly inspectable runtime proof.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 34350cd16d17.

Labels

Label justifications:

  • P1: A successful publish can leave a version inaccessible and block a publisher from retrying that version.
  • merge-risk: 🚨 compatibility: The new terminal retry cap changes existing publish behavior from indefinite retry to administrator recovery after repeated failures.
  • merge-risk: 🚨 availability: A capped finalization failure can leave a publisher waiting on an operator before the version becomes visible.
  • merge-risk: 🚨 security-boundary: The operator repair republishes a previously pending artifact and is responsible for preserving the required security-scan follow-ups.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🐚 platinum hermit.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The contributor describes a throwaway Convex deployment and after-fix results, but the cited proof pack or redacted request/response trace is not directly inspectable; attach it and update the PR body for re-review.

Evidence

What I checked:

  • Current publish boundary: Current main stages a version and later runs deferred enrichment plus the projection mutation; an error before that mutation can leave the staged version pending. (convex/lib/skillPublish.ts:705, 34350cd16d17)
  • Atomic repair path: The PR rechecks attempt eligibility inside the mutation, publishes the pending version, schedules security follow-ups, closes the attempt, and clears staged data transactionally. (convex/skills.ts:13786, 778ecf691de0)
  • Repair security gate: The PR permits recovery only for attempts with clean pre-publication checks and refuses active attempt ownership. (convex/publishAttempts.ts:539, 778ecf691de0)
  • Feature provenance: The staged-finalization path dates to commit 87ca030, identified as pull request 3391 and included in v0.23.3. (convex/lib/skillPublish.ts:667, 87ca030c30f3)
  • Proof artifact check: The available review scratch directory contains no cited proof pack or request/response trace; the PR comment describes results but does not expose inspectable runtime output.

Likely related people:

  • Patrick-Erichsen: Commit 87ca030 introduced the current staged skill finalization path, and the branch includes substantial recovery hardening authored by this area contributor. (role: introduced staged publish behavior and recent area contributor; confidence: high; commits: 87ca030c30f3, 50c4ffc1a027; files: convex/lib/skillPublish.ts, convex/publishAttempts.ts, convex/skills.ts)

Rank-up moves

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

  • Attach a redacted live deployment trace showing five terminal failures, successful repair, index/latest visibility, and scheduled scans.

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.

History

Review history (22 earlier review cycles; latest 8 shown)
  • reviewed 2026-08-05T19:29:45.244Z sha 91cd641 :: needs real behavior proof before merge. :: [P2] Do not schedule follow-ups after losing finalizer ownership | [P2] Clear the pending snapshot for repaired failed attempts | [P2] Pass the repair liveness clock into the queries | [P2] Fix the sweep cutoff at the action boundary | [P3] Record the orphan-repair invariant in a spec
  • reviewed 2026-08-05T20:49:46.887Z sha 91cd641 :: needs real behavior proof before merge. :: [P2] Skip follow-ups after a late finalizer claim | [P2] Clear the pending snapshot after a terminal repair | [P2] Pass liveness time into active-attempt queries | [P2] Pass the sweep cutoff into the candidate query | [P3] Record the orphan-repair invariant in a spec
  • reviewed 2026-08-05T22:18:16.004Z sha 91cd641 :: needs real behavior proof before merge. :: [P2] Skip follow-ups after a late finalizer claim | [P2] Clear the pending snapshot on every successful repair | [P2] Pass liveness time into active-attempt queries | [P2] Pass the sweep cutoff into the candidate query | [P3] Record the orphan-repair invariant in a spec
  • reviewed 2026-08-05T23:37:15.417Z sha 91cd641 :: needs real behavior proof before merge. :: [P2] Do not enqueue follow-ups after losing finalizer ownership | [P2] Clear staged publish data after repairing a failed attempt | [P2] Pass a fixed cutoff into the sweep query | [P3] Document the orphaned-publish recovery invariant
  • reviewed 2026-08-05T23:45:11.647Z sha 91cd641 :: needs real behavior proof before merge. :: [P2] Skip repair follow-ups after a finalizer claim wins | [P2] Clear staged data for every repaired version | [P2] Pass a fixed sweep cutoff into the query | [P3] Record the recovery invariant in specs
  • reviewed 2026-08-06T02:10:43.969Z sha 91cd641 :: needs real behavior proof before merge. :: [P2] Avoid duplicate follow-ups after a finalizer wins the race | [P2] Clear staged publication data on terminal-attempt repair | [P2] Use one cutoff for the entire repair sweep | [P3] Record the orphaned-publish recovery invariant in specs
  • reviewed 2026-08-06T03:57:37.371Z sha ad0b5f7 :: needs real behavior proof before merge. :: none
  • reviewed 2026-08-06T13:35:48.066Z sha b149533 :: needs real behavior proof before merge. :: none

@Patrick-Erichsen Patrick-Erichsen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This adds owner diagnostics and an operator repair for skill versions stranded in staged publication. The repair is not safe yet because a terminally failed publish attempt is not actually closed/cleared by the helper path.

LOC: +2087/-26 (9 files)

Finding: when the linked attempt is already failed, the close helper returns without clearing the persisted pendingPublication snapshot. The version can become public while its record remains internally staged. Add the cap-exhausted regression case and real Convex repair proof.

Best-fix verdict: too broad in its current form. Reusing the finalization contract is sound, but the atomic repair must explicitly handle terminal attempts before this operator path is safe.

Alternatives considered: a second cleanup mutation would restore the crash window; the better shape is one transaction that publishes and clears/closes every supported attempt state.

Code read: convex/maintenance.ts, convex/skills.ts, convex/lib/skillPublish.ts, publish-attempt helpers, HTTP owner diagnostics, and adjacent tests.

Remaining uncertainty: no after-fix staged publish/repair has been exercised on a real Convex deployment, and the branch is currently conflicted with main.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 automation 🚨 Merging this PR could break CI, automerge, proof capture, label sync, or automation. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 automation 🚨 Merging this PR could break CI, automerge, proof capture, label sync, or automation. labels Aug 5, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. P2 Normal backlog priority with limited blast radius. labels Aug 5, 2026
trippyogi and others added 14 commits August 5, 2026 19:37
…claw#3349)

A staged skill publish inserts the skillVersion as pending up front and
only projects it onto the skill's latest/tags/version-index once the
async publishAttempts finalize step succeeds. If that worker never runs
again (crashed action, exhausted retries), the version was left
orphaned forever: files exist, the duplicate-version guard blocks a
retry, but every metadata read 404s.

- Cap consecutive transient finalization failures
  (finalizationFailureCount, publishAttempts.ts) so a stuck attempt
  surfaces as failed instead of looping forever.
- Add an admin-gated repair path (maintenance.ts) that re-runs
  finalization for one orphaned pending version, or sweeps the whole
  table in age-bounded batches, from the exact insert args captured on
  the version at publish time. Refuses to act while a live attempt
  still owns the version, and force-closes the original attempt row
  afterward so the normal dispatcher can't re-claim it and re-run
  followups.
- Surface pending/blocked publication state to the authenticated owner
  on version reads instead of a bare 404, without leaking it to other
  callers (skillsV1.ts).
- Authorize owner-visible pending/blocked reads via publisher scope
- Return 409 when linked finalize attempt already failed
- Do not treat checkFailureCount as abandoned (scanner retry gaps)
…air flow

- releaseFinalizationClaimPatch (publishAttempts.ts) now caps
  consecutive finalization failures only for kind==="skill". Package
  attempts have no repair path yet, so they retry unbounded instead of
  becoming a permanent orphan.

- isActiveAttemptLive (publishAttempts.ts) no longer abandons a
  non-terminal attempt just because finalizationFailureCount > 0. It
  now checks staleness against updatedAt (falling back to createdAt)
  using ACTIVE_ATTEMPT_RETRYABLE_STALE_MS for attempts with retry
  activity, or ACTIVE_ATTEMPT_UNCLAIMED_GRACE_MS for zero-failure
  attempts, so a below-cap dispatcher retry (or a long pending_checks
  phase that just transitioned cleanly) is not raced by manual repair.
  Added findActiveSkillPublishAttemptByIdInternal so the repair
  pre-check can look up a known publishAttemptId directly instead of
  only scanning by slug/version.

- repairOrphanedPendingSkillVersionHandler (maintenance.ts) now
  publishes the pending version and closes the orphaned attempt
  atomically via a new publishPendingVersionAndCloseAttemptInternal
  mutation (skills.ts), closing before follow-ups are scheduled. This
  removes the publish-before-close race where a crash between publish
  and close left the version published but the attempt reclaimable.
  Also handles the already-published-but-still-open-attempt retry
  case as an attempt-cleanup path.

- skillsGetRouterV1Handler exact-version path (skillsV1.ts) falls back
  to an owner-visible pending-publication diagnostic via
  getSkillBySlugInternal + describeOwnerVisibleSkillVersionState when
  the public getBySlug lookup misses entirely, so a brand-new hidden
  skill (pending its first publish) no longer 404s for its owner.

Tests added/updated in publishAttempts.test.ts, maintenance.test.ts,
and httpApiV1.handlers.test.ts for all four findings.
@Patrick-Erichsen
Patrick-Erichsen force-pushed the fix/3349-publish-version-projection branch from 91cd641 to ad0b5f7 Compare August 6, 2026 03:53
Cap-exhausted failed attempts keep a fresh updatedAt and failure count,
so isActiveAttemptLive blocked orphan repair for ~20m even though the
dispatcher cannot reclaim them. Gate the live check on active statuses
only, matching the direct-ID precheck, and cover the failed+cap path.
@trippyogi

trippyogi commented Aug 6, 2026

Copy link
Copy Markdown
Author

Thanks @Patrick-Erichsen, agreeing with the external review. your atomic mutation rewrite correctly addresses the original P1. One narrow P2 remained and is fixed in b149533.

P2
findActiveSkillPublishAttemptByIdInternal already gated isActiveAttemptLive on ACTIVE_PUBLISH_ATTEMPT_STATUSES, but inspectSkillPublishAttemptForOrphanRepair (and the legacy slug/version scan) applied the live check to terminal failed too. A freshly cap-exhausted attempt (status: "failed", finalizationFailureCount: 5, fresh updatedAt) looked “live” for ~20 minutes even though the dispatcher cannot reclaim it — so the outer precheck could allow repair while the atomic mutation rejected claim-active / attempt-active.

Fix is the status-guard mirror only; plus a regression that uses failed + clean checks + count 5 + fresh updatedAt (the prior terminal test used finalized, which missed this path).

Convex cloud evidence (throwaway dev:sleek-meadowlark-276, harness only for fixtures; public HTTP via .convex.site):

  1. Before your rewrite (original P1 shape): publish / security scheduling / attempt close / pendingPublication cleanup were split across crash-prone action steps — a published version could remain internally staged or an attempt could stay reclaimable after publish.

  2. After the rewrite, tip ad0b5f71 (before this P2 fix): the atomic mutation is correct, but immediate repair of a freshly capped failure still fails:

    • five finalization failures → status: "failed", count 5, no result
    • before HTTP: anon 404; owner 409 (says operator can repair)
    • dry-run: would repair
    • apply: repaired: false, reason: "attempt-active"
    • after: still pending + pendingPublication present
    • pack: tip unrepaired run
  3. After this P2 fix on the same deployment:

    • same five-failure setup
    • immediate apply: repaired: true
    • 1.0.1 published; latest + tags.latest1.0.1; versions → 2
    • pendingPublication cleared
    • four security follow-ups scheduled for the repaired versionId (vt.scanWithVirusTotal + three enqueueSkillVersionScanInternal)
    • before: non-owner generic 404; after: non-owner 200 for 1.0.1
    • pack: proof/pr-3401-ad0b5f71-fixed/orphan-repair-proof.json

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

Labels

merge-risk: 🚨 availability 🚨 Merging this PR could cause crashes, hangs, restart loops, stalls, or process outages. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P1 High-priority user-facing bug, regression, or broken workflow. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill publish returns success and reserves version, but version is absent from latest/version index

2 participants