Skip to content

fix(ci): build the main bundle in the jobs that publish the action ledger - #948

Merged
steipete merged 1 commit into
openclaw:mainfrom
masatohoshino:fix/ledger-publish-main-bundle
Jul 31, 2026
Merged

fix(ci): build the main bundle in the jobs that publish the action ledger#948
steipete merged 1 commit into
openclaw:mainfrom
masatohoshino:fix/ledger-publish-main-bundle

Conversation

@masatohoshino

@masatohoshino masatohoshino commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Fixes #946.

What this fixes

repair comment router and repair cluster worker's execute job run
node dist/clawsweeper.js publish-action-event-paths, but both asked setup-pnpm
for build-script: build:repair. That script is tsc -p tsconfig.repair.json and
does not emit dist/clawsweeper.js, which comes from the main build. The
Publish immutable command action ledger step therefore failed with
MODULE_NOT_FOUND on every run that reached it.

Both jobs now request build:node, a new script that chains the two Node bundles
they use and leaves out the dashboard leg neither runs. The router's curated sparse
checkout also gains tsconfig.json so the main build can find its config; the
execute job already checks out the whole tree.

build:node chains rather than selecting both scripts by regex, because pnpm runs
regex-selected scripts concurrently and tsconfig.repair.json also compiles five
non-repair sources (src/repository-profiles.ts, src/codex-output-capture.ts,
src/codex-spawn.ts, src/codex-app-server-worker.ts,
src/codex-process-worker.ts) that tsconfig.json emits to the same paths. Two
concurrent compilers would race on those outputs.

Rebased onto current main

Head c5ab9976, base origin/main 9e464d65. The review on this PR asked for the
proof to be re-taken against current main, so every capture below was re-run at
this head. The diff is unchanged at +128 −4.

The two workflow files this PR edits are byte-identical between the earlier base
8365a79a and current main, and both direct main-bundle call sites are still
present:

$ git diff --stat 8365a79a origin/main -- .github/workflows/repair-comment-router.yml .github/workflows/repair-cluster-worker.yml
(no output: identical)

$ git log --oneline 8365a79a..origin/main -- .github/workflows/repair-comment-router.yml .github/workflows/repair-cluster-worker.yml
(no output: no commit touched them)

$ git grep -n "node dist/clawsweeper.js publish-action-event-paths" origin/main -- .github/workflows/repair-comment-router.yml .github/workflows/repair-cluster-worker.yml
origin/main:.github/workflows/repair-cluster-worker.yml:905:          node dist/clawsweeper.js publish-action-event-paths \
origin/main:.github/workflows/repair-comment-router.yml:521:          node dist/clawsweeper.js publish-action-event-paths \

The router's sparse checkout at current main still carries the broad src entry
and still omits tsconfig.json, which is exactly what the added entry supplies:

$ git show origin/main:.github/workflows/repair-comment-router.yml | sed -n "99,114p"
            .github
            config
            jobs
            prompts/pr-close-coverage-proof.md
            results
            schema/clawsweeper-pr-close-coverage-proof.schema.json
            scripts/hydrate-state.ts
            scripts/prepare-worker-record-cache.ts
            scripts/worker-blobs.ts
            scripts/worker-records.ts
            src
            package.json
            pnpm-lock.yaml
            pnpm-workspace.yaml
            tsconfig.repair.json
          sparse-checkout-cone-mode: false

Evidence

Driving the exact build-script value each job passes at head c5ab9976, then
invoking the bundle the failing step invokes:

# clawsweeper @ c5ab9976, base origin/main 9e464d65

## BEFORE - the build-script these jobs used to pass
$ rm -rf dist && pnpm run --silent build:repair
$ node dist/clawsweeper.js publish-action-event-paths --paths-file /dev/null
Error: Cannot find module '/home/masato/dev/clawsweeper/dist/clawsweeper.js'

## AFTER - the build-script this patch passes
$ rm -rf dist && pnpm run --silent build:node
$ tsc -p tsconfig.json
$ tsc -p tsconfig.repair.json
$ ls dist/clawsweeper.js dist/repair/action-ledger-cli.js
dist/clawsweeper.js
dist/repair/action-ledger-cli.js
$ ls dist/dashboard    # the leg neither job runs is still skipped
ls: cannot access 'dist/dashboard': No such file or directory
$ node dist/clawsweeper.js publish-action-event-paths --paths-file /dev/null
Error: action event publish path manifest is not a file: /dev/null
    at publishActionEventPathsCommand (file:///home/masato/dev/clawsweeper/dist/clawsweeper.js:26136:15)
    at main (file:///home/masato/dev/clawsweeper/dist/clawsweeper.js:26198:19)

After the change the module resolves and execution reaches
publishActionEventPathsCommand inside dist/clawsweeper.js, failing only on the
placeholder argument. That is the discriminator: the subcommand is reachable.

The router's sparse entry is load-bearing on its own. Its checkout is
cone-mode: false with a curated list, so a file it does not name is absent:

# clawsweeper @ c5ab9976
$ mv tsconfig.json /tmp/ && pnpm run build:node
$ tsc -p tsconfig.json
error TS5058: The specified path does not exist: '/home/masato/dev/clawsweeper/tsconfig.json'.
[ELIFECYCLE] Command failed with exit code 1.
[ELIFECYCLE] Command failed with exit code 1.

The guard

test/repair/workflow-sparse-checkout.test.ts gains a check that walks every
workflow, finds each job with a step that runs dist/clawsweeper.js directly, and
requires that job to obtain the bundle — by a build-script that builds it, or by
restoring the clawsweeper-runtime-dist artifact, which is how sweep.yml's
review shard gets it. Jobs that build from a sparse checkout must also carry
tsconfig.json. It audits every job that invokes the bundle directly — nine jobs
carrying fifteen invocation lines today: two jobs in assist.yml (five lines),
five in sweep.yml (eight lines), and the two changed here (one line each).

Two details are deliberate. The helper resolves a build-script through
package.json
, following pnpm run chains, so build, build:node and
build:all are all recognised without restating which name covers which bundle.
And the artifact exemption requires that exact artifact name rather than accepting
actions/download-artifact in general — the execute job downloads unrelated worker
artifacts, and a looser check would let it revert silently.

The audit is deliberately limited to direct invocations. A job that reaches the
bundle through a package script is not covered, because some build-script values
are GitHub expressions that only a live run resolves — sweep.yml's
event-review-apply picks between build:all and build:repair that way. Widening
the audit would mean evaluating those expressions, so it is left out rather than
guessed at.

Reverting any one of the three parts fails the guard, and nothing else:

# clawsweeper @ c5ab9976  guard: node --test test/repair/workflow-sparse-checkout.test.ts

### revert router build-script only  (:184 build:node -> build:repair)
reverted line:           build-script: build:repair
ℹ pass 7
ℹ fail 1
  AssertionError: .github/workflows/repair-comment-router.yml:route-comments runs dist/clawsweeper.js but no build-script emits it: ["build:repair"]

### revert cluster-worker build-script only  (:572 build:node -> build:repair)
reverted line:           build-script: build:repair
ℹ pass 7
ℹ fail 1
  AssertionError: .github/workflows/repair-cluster-worker.yml:execute runs dist/clawsweeper.js but no build-script emits it: ["build:repair"]

### revert router sparse tsconfig.json only  (delete :113)
line 113 is now:             tsconfig.repair.json
ℹ pass 7
ℹ fail 1
  AssertionError: .github/workflows/repair-comment-router.yml:route-comments builds dist/clawsweeper.js from a sparse checkout that omits tsconfig.json

### restored
ℹ pass 8
ℹ fail 0

The pre-existing build-script: build:repair string assertion became the same kind
of resolved check, since the router no longer passes that literal.

Proof summary

  • Behavior addressed: the Publish immutable command action ledger step in
    repair comment router and in repair cluster worker's execute job aborts
    with MODULE_NOT_FOUND because the job never builds dist/clawsweeper.js.

  • Real environment tested: production GitHub Actions runs for the router
    failure (see The immutable command action ledger never publishes: its job never builds dist/clawsweeper.js #946); local Node v24.18.0 running the exact build-script values
    the workflows pass, plus the built CLI itself.

  • Exact steps or command run after this patch:

    rm -rf dist && pnpm run build:node
    node dist/clawsweeper.js publish-action-event-paths --paths-file /dev/null
    node --test test/repair/workflow-sparse-checkout.test.ts
  • Evidence after fix: the capture above — the bundle exists, the dashboard leg
    is still skipped, and the CLI reaches publishActionEventPathsCommand.

  • Observed result after fix: pass 8 / fail 0 on the guard file, and
    fail 1 naming the exact missing piece when any one part is reverted.

  • What was not tested: this patch is not deployed, so there is no production
    run of the fixed jobs. The immutable command action ledger never publishes: its job never builds dist/clawsweeper.js #946 documents the router failing repeatedly in
    production; for the execute job the same defect is established by reading the
    workflow — it passes build:repair and runs the bundle — rather than by an
    observed run, because that job is conditional and I did not catch it in the act.
    pnpm run check at this head on Node v24.18.0 ran 2,812 tests with 6 failures,
    all host-caused and all inside test/repair/target-validation.test.ts, which this
    patch does not touch: three need git worktree list -z (this host has Git
    2.34.1, -z arrived in 2.36) and three cannot resolve the bun/npm/pnpm
    containment fixtures. pnpm run build:all exits 0, and every static check and
    lint lane passes.

Not in scope

@masatohoshino
masatohoshino requested a review from a team as a code owner July 30, 2026 00:21
@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. P1 Urgent regression or broken agent/channel workflow affecting real users now. labels Jul 30, 2026
@clawsweeper

clawsweeper Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 30, 2026, 8:26 PM ET / July 31, 2026, 00:26 UTC.

ClawSweeper review

What this changes

The PR makes the repair comment-router and repair cluster-worker jobs build both required Node bundles before publishing action-ledger paths, adds tsconfig.json to the router’s sparse checkout, and adds a workflow audit for direct main-CLI invocations.

Merge readiness

⚠️ Ready for maintainer review - 1 item remains

This is a focused fix for the action-ledger publication failure tracked by #946. The patch and supplied terminal proof credibly show that the jobs now emit the CLI bundle they invoke, with a guard against regression; it should remain open for normal maintainer landing rather than cleanup closure.

Priority: P1
Reviewed head: c5ab99766c885184d84ffb25e9e11d7abe694757

Review scores

Measure Result What it means
Overall readiness 🐚 platinum hermit (4/6) A focused, well-scoped workflow repair with strong local runtime proof and regression coverage; the remaining uncertainty is the unobserved fixed production workflow path.
Proof confidence 🦞 diamond lobster (5/6) Sufficient (terminal): The PR body provides after-fix terminal proof that the exact build-script value emits both required bundles and that the main CLI reaches the intended publication command; it also records a passing focused workflow guard. Redact private paths, endpoints, and credentials in any future workflow evidence.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Verification

Check Result Evidence
Real behavior Verified Sufficient (terminal): The PR body provides after-fix terminal proof that the exact build-script value emits both required bundles and that the main CLI reaches the intended publication command; it also records a passing focused workflow guard. Redact private paths, endpoints, and credentials in any future workflow evidence.
Evidence reviewed 5 items Focused workflow fix: At PR head, both affected jobs change their setup input from build:repair to sequential build:node, which emits the main CLI bundle required by the later publication command.
Sparse-checkout dependency: The router’s curated sparse checkout adds tsconfig.json, matching the new main TypeScript build’s configuration dependency.
Sequential build contract: build:node runs the main build before the repair build, avoiding concurrent TypeScript compilers writing overlapping output paths while omitting the unused dashboard build.
Findings None None.
Security None None.

How this fits together

The repair comment router and cluster worker are GitHub Actions jobs that process repair work and then publish immutable action-ledger paths. Their setup step builds runtime bundles consumed by later CLI commands, which in turn update the durable action-ledger publication path.

flowchart LR
  A[Repair work arrives] --> B[Router or cluster-worker job]
  B --> C[Setup installs and builds Node bundles]
  C --> D[Main CLI bundle]
  C --> E[Repair CLI bundle]
  D --> F[Publish action-ledger paths]
  E --> F
  F --> G[Durable action ledger]
Loading

Before merge

  • Resolve merge risk (P1) - This changes build selection in two write-capable Actions jobs. The supplied terminal proof establishes bundle reachability, but only a controlled GitHub Actions run can exercise the exact post-merge workflow path and publication environment.
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Patch scope 5 files affected; 128 added, 4 removed The change stays concentrated in the two affected workflows, one shared build script, and focused regression coverage.
Direct CLI audit 9 jobs and 15 invocation lines covered The new guard checks the repository’s direct main-CLI workflow callers rather than only the two repaired jobs.

Root-cause cluster

Relationship: fixed_by_candidate
Canonical: #946
Summary: This PR is the concrete candidate fix for the missing-main-bundle defect described in the linked issue; the other referenced roadmap items concern separate publication or review-cache behavior.

Members:

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

Merge-risk options

Maintainer options:

  1. Land with targeted monitoring (recommended)
    Accept the strong build-and-CLI proof, then verify the next eligible router and cluster-worker publication runs complete the ledger step in GitHub Actions.
  2. Exercise a controlled workflow first
    Run a controlled eligible workflow before merge if maintainers require direct evidence from the exact write-capable Actions environment.

Technical review

Best possible solution:

Land the narrow sequential build:node path with its workflow guard, then monitor the next eligible router and cluster-worker publication runs for successful action-ledger publishing.

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

Yes—the workflow source directly pairs build:repair with a later dist/clawsweeper.js invocation, and the supplied Node 24 capture shows that the former build omits that bundle while the new sequential build reaches the intended CLI command.

Is this the best way to solve the issue?

Yes—the sequential shared build script is the narrowest maintainable repair because it produces exactly the two Node bundles these jobs use, preserves the unused dashboard exclusion, and the regression guard follows script aliases instead of hard-coding one script name.

AGENTS.md: found and applied where relevant.

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

Labels

Label justifications:

  • P1: The reported defect prevents immutable action-ledger publishing whenever the affected production job reaches its final CLI step.
  • merge-risk: 🚨 automation: The PR changes build selection for two automation jobs that publish durable ledger data, so an incorrect bundle contract would surface only when those workflows execute.
  • 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 provides after-fix terminal proof that the exact build-script value emits both required bundles and that the main CLI reaches the intended publication command; it also records a passing focused workflow guard. Redact private paths, endpoints, and credentials in any future workflow evidence.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body provides after-fix terminal proof that the exact build-script value emits both required bundles and that the main CLI reaches the intended publication command; it also records a passing focused workflow guard. Redact private paths, endpoints, and credentials in any future workflow evidence.

Evidence

What I checked:

  • Focused workflow fix: At PR head, both affected jobs change their setup input from build:repair to sequential build:node, which emits the main CLI bundle required by the later publication command. (.github/workflows/repair-comment-router.yml:178, c5ab99766c88)
  • Sparse-checkout dependency: The router’s curated sparse checkout adds tsconfig.json, matching the new main TypeScript build’s configuration dependency. (.github/workflows/repair-comment-router.yml:113, c5ab99766c88)
  • Sequential build contract: build:node runs the main build before the repair build, avoiding concurrent TypeScript compilers writing overlapping output paths while omitting the unused dashboard build. (package.json:11, c5ab99766c88)
  • Regression guard: The added workflow test resolves build-script chains through package.json, checks direct dist/clawsweeper.js callers, and rejects sparse builds that omit tsconfig.json. The PR body records successful restoration after each targeted revert. (test/repair/workflow-sparse-checkout.test.ts:52, c5ab99766c88)
  • Observed after-fix behavior: The PR body records a Node 24 run of build:node that creates both dist/clawsweeper.js and the repair CLI, then reaches the publication command instead of failing module resolution; the supplied CI context also reports the sparse-build smoke and pnpm check as successful. (c5ab99766c88)

Likely related people:

  • masatohoshino: Authored the focused workflow, package-script, and regression-test change and supplied the source-level and runtime reproduction for the affected ledger-publication path; broader ownership could not be established from the available read-only inspection. (role: current workflow contributor; confidence: low; commits: c5ab99766c88; files: .github/workflows/repair-comment-router.yml, .github/workflows/repair-cluster-worker.yml, package.json)

Rank-up moves

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

  • If a safe eligible run is available, add a redacted GitHub Actions capture showing the repaired publication step completes in its actual workflow environment.

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 (8 earlier review cycles)
  • reviewed 2026-07-30T00:26:22.712Z sha 144236b :: needs maintainer review before merge. :: none
  • reviewed 2026-07-30T11:11:49.251Z sha 144236b :: needs maintainer review before merge. :: none
  • reviewed 2026-07-30T12:22:25.966Z sha 144236b :: needs real behavior proof before merge. :: [P1] Reconcile the router build with current sparse checkout
  • reviewed 2026-07-30T14:59:08.891Z sha c5ab997 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-30T16:06:22.944Z sha c5ab997 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-30T17:59:57.256Z sha c5ab997 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-30T21:42:36.381Z sha c5ab997 :: needs maintainer review before merge. :: none
  • reviewed 2026-07-30T23:03:28.442Z sha c5ab997 :: needs maintainer review before merge. :: none

@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. 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. merge-risk: 🚨 automation 🚨 Merging this PR could break CI, automerge, proof capture, label sync, or automation. and removed rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. proof: sufficient Contributor real behavior proof is sufficient. 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 Jul 30, 2026
…dger

The comment router and the cluster worker's execute job run
`node dist/clawsweeper.js publish-action-event-paths`, but both asked setup-pnpm
for `build:repair`, which compiles tsconfig.repair.json only. dist/clawsweeper.js
comes from the main build, so the step failed with MODULE_NOT_FOUND on every run
that reached it.

Both jobs now request `build:node`, a new script that chains the two Node bundles
they use and leaves out the dashboard leg neither runs. It has to chain rather
than select both by regex: pnpm runs regex-selected scripts concurrently, and
tsconfig.repair.json also compiles five non-repair sources that tsconfig.json
emits to the same paths, so the two compilers would race on the same output.

The router's curated sparse checkout gains tsconfig.json so the main build can
find its config; the execute job checks out the whole tree already.

The guard resolves a build-script through package.json rather than listing which
script names cover which bundle, so `build`, `build:node` and `build:all` are all
recognised without restating the mapping. It walks every workflow, finds each job
that runs the bundle, and requires that job to build it or to restore the named
`clawsweeper-runtime-dist` artifact the way sweep's review shard does. Keying the
exemption on that artifact name matters: the execute job downloads unrelated
worker artifacts, and a looser check would have let it revert silently.
@masatohoshino
masatohoshino force-pushed the fix/ledger-publish-main-bundle branch from 144236b to c5ab997 Compare July 30, 2026 14:45
@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed 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. labels Jul 30, 2026
masatohoshino added a commit to masatohoshino/clawsweeper that referenced this pull request Jul 30, 2026
…ew cache

itemContentDigest fed context.pullChecks into the digest verbatim, and
pullChecksContext fills that from commits/{headSha}/check-runs with no author or
app filter. A completed review writes its labels and durable comment, which
retriggers clawsweeper-dispatch and github-activity; those add check runs to the
head, the digest changes, reviewContentCacheHit misses, and the unchanged head is
reviewed again -- which writes labels again. On openclaw#948's head 144236b, 26 of 38
check runs were those two jobs, and 13 of them were byte-identical after
compactCheckRun.

Across every review comment on this repo the durable comments record 154
consecutive re-reviews of an unchanged head, median gap 33 minutes, below the
HOURLY_REVIEW_MS floor that reviewCadenceMs can return.

De-duplicate the compacted runs inside the digest. Once a run is reduced to
{name,status,conclusion,app} a repeat reports nothing the first one did not,
while a run that newly fails differs in conclusion and keeps its own entry. This
touches the cache key only: pullChecksContext is unchanged, so the check list the
reviewer sees through reviewContextLedger is unchanged.

The same bot was already excluded from timeline, labels, and PR review comments;
checks were the remaining input.
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. and removed rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. labels Jul 30, 2026
@steipete
steipete merged commit ad1e32a into openclaw:main Jul 31, 2026
27 of 28 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 automation 🚨 Merging this PR could break CI, automerge, proof capture, label sync, or automation. P1 Urgent regression or broken agent/channel workflow affecting real users now. proof: sufficient Contributor real behavior proof is sufficient. 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.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The immutable command action ledger never publishes: its job never builds dist/clawsweeper.js

2 participants