Docs: run-workflows-on-a-schedule tells readers to curl /health for queue state, which no longer lists schedules
Inbox API contract and SwampClubClient inbox methods: summary, list, get and mark-read, pinned by a shared fixture and design/surfaces/inbox.md
Datastore rework Phase 5 (team mode) 2/3: the CLI's serve upstream — with serverAddress, a v3 checkout commits, reads chunks and catches up through serve's datastore API, with no storage credentials
Scheduled flaky-test detection is failing
v3 read model: guard against aliased key spellings on case-insensitive filesystems, without slowing replay
Scheduled flaky-test detection is failing
stagecraft remote studio: one long-lived connection to serve instead of a swamp process per read
stagecraft remote studio poll: follow-ups from #3658 review (flaky test, mid-poll first page, quiet-poll test)
docs(manual): the manual documents swamp subscription status and start — standings, call to action, flags and --json output
swamp subscription start opens the Swamp Club billing page, or a collective's with --collective, and status points its call to action at it
v3: the compaction policy bounds how much history a fresh clone replays (retainMs, minCommits, retainCommits) and the base load skips files the tail removes
datastore_v3_replica_verify_test stall case flakes under the full integration run: restore.pid is read before the stub writes it
v3 on S3/GCS: a replica restore yields a corrupt commits.db (fails SQLite's integrity check), so fresh clones and restores of the datastore fail; reproduces with Litestream alone from its first compacted L1 file (found by #3916)
swamp subscription status reports the plan and billing standing of the signed-in user and each collective, worded as auth whoami words it
/o/<slug>/billing sends a signed-out visitor to the collective page, or a 404 when private, instead of through login and back like /billing
swamp-extensions GCS storage test 'put: an abort mid-upload leaves no object and no resumable session' fails about 1 run in 5 (fixed 50 ms sleeps)
refactor(cli): share auth whoami's collective-standing helpers ahead of swamp subscription, and pin Personal License and Admin standings
@swamp/cve/tailworm: check the reachability matrix against a Tailscale-hosted tailnet
AWS codegen treats nested primaryIdentifier pointers as top-level fields
AWS codegen collapses nested createOnly/readOnly paths to their last segment
Generated state schemas require every child of nested objects, so normal resources warn on create/get
swamp-club.com/cve/tailworm states two things its sources do not say: finding 5's memory growth and no exploitation in the wild
cve/tailworm extension README says the findings were not seen in the wild, which no source states
Datastore rework Phase 5 (team mode) 1/3: serve's datastore API — commit, chunk and catch-up endpoints, authorisation on each op's intent, principal stamping and actionable conflicts
@swamp/cve/tailworm: reachability follow-ups from #3919 review
@swamp/cve/tailworm: opt-in reachability matrix from each node's packet filter
Datastore rework Phase 5: content-level authorisation for forwarded definition and evaluated-file writes
swamp-club.com/cve/tailworm: cover grade, probeScript, gradeFleet and the reachability matrix (extension 2026.10.25.5)
Docs: --trusted-hosts accepts host:port for public addresses on non-default ports
@swamp/cve/tailworm: after mitigate caps headscale, the rescan still tells you to set MemoryMax and Restart=always
@swamp/cve/tailworm grade: unix serve targets the probe could not resolve are graded as ordinary sockets
kubernetes: externalsecret and normalizeMeta follow-ups from #3907
v3 crash recovery's progress line breaks --json stderr: a failing command that recovered prints text before its JSON error (regression from #3363 / #3893)
Docs: vaults reference should say a wide local_encryption key file gets a warning
Docs: manual states the old pre-flight check rule and scores fast-check by deno doc --lint
Docs: define the sensitive-output fallback vault order and document the doctor vaults fallback warning
v3 long silent waits: crash recovery runs ~24 s with no output, data prune is silent 6-10 s in log mode, and a lagging read hangs ~112 s when Litestream's listing is cut (found by #3756)
Add @swamp/cve/http2shell: scan and mitigate the Brotli decoder RCE (CVE-2026-111497, Node2Shell/HTTP2Shell)
extension_tarball_analyzer_test fails on macOS: tar --mode is GNU-only
S3/GCS datastore: a push that fails after uploading drops its recorded deletes, so the retry brings deleted data back
v2 S3: about 4-5% of serial workflow runs fail with datastore_unpublished_data_version ('a concurrent run or the serve poller synced') when nothing else is running (found by #3756)
Datastore rework Phase 4 I: dogfood and benchmark solo v3 (filesystem, S3, GCS) in a throwaway repo with the released binary, check the kill criteria, and decide whether to announce
v3 bucket outage: a command cut off while becoming the writer says its changes are saved locally when nothing was saved (workflow approve), and the suggested recover fails for a run cut mid-step (found by #3756)
auth login browser flow prints a fatal stack trace when swamp-club cannot be reached
Scheduled flaky-test detection is failing
v3 first clone and restore of a bucket datastore take 2.6-3x v2, missing #3418's 1.5x target (found by #3756)
CVE pages: horizontally scrolling code blocks are not keyboard-reachable
Homepage club plate link has no visible keyboard focus
Scheduled flaky-test detection is failing
swamp update downloads before failing in a sticky directory with another user's binary, and blames an immutable flag
Docs: extra-headers how-to systemd snippet puts a path in SWAMP_SERVE_EXTRA_HEADERS
Docs: install-swamp says SWAMP_HOME moves everything, but agent skill folders stay in the user's home folder
Docs: dashboard Approvals view shows run context, reason and per-viewer decide state
v3 bucket outage: a workflow run whose checkpoint committed is told nothing was committed, three outage errors have no stable code, and exit takes 15-60 s (found by #3756)
v3 identity on buckets: S3 checkouts with different endpoint spellings fork the datastore silently, and a hostname change blocks every write for ~5 minutes (found by #3756)
typed_workflow_passes_test child-sentinel case flakes under full-suite load: f.received.at(-1) reads the compare step's empty payload
extension push drops local modules when the repo under a node_modules folder is reached through a symlinked path (macOS /var, the swamp-club#3782 fix)
Teach defineBehavior in the extension skill now that swamp-testing 0.20261013.52 exports it
Docs: issue redaction keeps git ids and non-address colon runs, and asks before posting (swamp-club#3686)
Docs: worker daemon enable reference is missing --ca-cert, --concurrency and SWAMP_SERVE_EXTRA_HEADERS
v3 on S3/GCS: a write whose commit cannot reach the bucket prints "succeeded" on --json, exits 1, and is lost (confirm-before-output, found by #3756)
swamp-club /cve/dirtyfrag page shows --input targetHost/sshUser/sshKey/dockerContainer, which the CLI rejects
v3: datastore config migrate skips every workflow that has run (name-committed), and they are then "not found" (found by #3756)
@swamp/cve/dirtyfrag report suggests commands for dirtyfrag-scanner whatever the model is named
v3 on a bucket: after a commit fails because the bucket is unreachable, the closing sync still waits its full 60 s before the command exits
Interactive history and output search pickers cannot open a run under a non-default datastore
v3 recovery sweep: dot-prefixed data names escape it, HFS+ non-ASCII names are deleted by it, and an old mtime keeps a dropped write's file (bug hunt group 8)
Source glob expansion crashes when a directory under the glob parent disappears mid-walk
v3 chunk barrier on macOS: use F_BARRIERFSYNC (ordering) instead of F_FULLFSYNC (full drive-cache flush), cutting ~10-25 ms (200 ms+ on a busy disk) per command
extension_source_add_test globs the real home directory and flakes when a file in ~ disappears mid-walk
v3 join check refuses a fresh managedConfig checkout on S3/GCS: the datastore extension's auto-install writes the managed lockfile first (regression of #3690)
Docs: doctor datastores reference for the v3 content check and lost format marker repair
Docs: step dataOutputOverrides vaultName and the field-by-field override merge (swamp-club#3606)
Docs: data name portability rule and warning
Docs: vault create and vault migrate refuse a local_encryption name with leftover storage
v3 namespaces: cross-namespace reads return the reader's own content, a namespaced local tier is overwritten by solo commits, and namespaces can collide with swamp's own .swamp/ directories (bug hunt group 7)
v3: a checkout holding v2 records joins a v3 datastore through .swamp.yaml unguarded, overwriting its records and diverging for good (bug hunt group 5)
v3 on S3/GCS: the namespace refusal names setup filesystem, and an unreadable marker on a format-3 repo says "will not open … as format 2" (found by swamp-uat#715)
v3 on S3/GCS: setup on a prefix holding only swamp's format-3 marker fails with "this swamp release can't open" format 3 (found by swamp-uat#715)
Workflow runs ignore defaultVault: step sensitive outputs land in the first vault, and validate predicts a vault the run doesn't use
v3 local durability: chunks aren't fsynced before the commit naming them, so a power cut can wedge every checkout; torn writer and format markers don't heal (bug hunt group 4)
v3: chunk durability barrier costs a full drive-cache flush per command on macOS; use an ordering barrier
Scheduled flaky-test detection is failing
ssh: follow-ups from #3581 review — master rekey vs per-call known_hosts, settle error handling, atomic new-file mode
v3 on S3/GCS: a fresh checkout whose restore from the replica fails reports an empty datastore and exits 0 (found by swamp-uat#715)
issue-lifecycle start drops issue comments: context.comments is always empty
swamp CLI: revokeCollectiveToken should tell an unknown token from an unknown collective once swamp-club answers 404
Dev stack serves corrupted gzip under Vite: browsers fail with ERR_CONTENT_DECODING_FAILED
worker daemon enable: an unreadable --ca-cert passes enable, and SWAMP_SERVE_EXTRA_HEADERS is silently dropped under sudo
v3: a crashed workflow run and its completed steps' data are deleted by recovery before workflow recover or serve's reaper can see them (bug hunt group 6)
Scheduled flaky-test detection is failing
v3 outbox: a reported failure can land, a commit can name a deleted chunk, and a fenced writer is told nothing landed when it did (bug hunt group 3)
v3: writer liveness is judged wrong: a same-hostname container takes over a live writer, a stalled writer's file is reverted then committed, and a fenced retention pass rewinds the new writer (bug hunt group 1)
agent-runner and deno-runner: support Windows (both refuse to start: Unsupported operating system)
v3 replication: check a possible S1 in serve's retake, fix serve wedging on a retake mid-replacement, and stop 'the next write replicates them' being false (bug hunt group 2)
Enforce the minimum S3/GCS extension version for v3 bucket datastores from the lockfile
Datastore rework Phase 4 E: v3 on S3 and GCS (solo mode): setup --format 3 on buckets, replication as a datastore property, end to end
doctor datastores decides v3 from the format key, so an override pointed at a v3 bucket runs the v2 contamination check and repair
Retention under serve load: measure and fix automatic passes against #3518's busy-serve contention, and the large-backlog first pass
Scheduled flaky-test detection is failing
S3/GCS datastores: keep v2 sync off v3 buckets (exclude _litestream/, refuse a format-3 marker) for swamp releases before v20261009.154711.0
v3: a refused commit leaves its staged files in the checkout for good, so that checkout shows data the datastore doesn't hold (exposed by #3532; swamp-uat breakglass test failing)
Datastore sync: a no-op push after a model-scoped pull arms the remote commitSeq, hiding other hosts' commits until the next commit
Regression from #3546: legacy (hashless) cache files lose their mtime trust, so a peer's deletion can be undone and untouched files are re-uploaded (seed the own record once)
@swamp/s3-datastore and @swamp/gcs-datastore: pull's same-size fast path trusts the pushing machine's mtime, so a conflicting local file can be kept
Scheduled flaky-test detection is failing
Datastore rework Phase 4 G: S3 and GCS extensions implement replicaTarget() for v3 Litestream replication
v3: a data name emptied of every version restarts at version 1, reusing a number for different content (use the partition's highWater; refuse a reused version)
Docs: garbageCollection retention — per-kind keys, automatic passes, and what is never removed
Datastore rework Phase 4: a provider capability to remove abandoned Litestream lineage paths on buckets (replicaPaths), so chunk GC isn't deferred forever
In-memory remote: model create-only data version writes so core tests can pin them (follow-up to swamp-club#3377)
Datastore rework Phase 4: a provider-supplied replica target (replicaTarget()) so v3 replicates to the datastore's own bucket, plus conformance
v3 commit outbox: a discarded entry is removed without fsync, so after a power cut recovery can land a commit whose command reported failure
Relationships
#3604 worker daemon enable: an unreadable --ca-cert passes enable, and SWAMP_SERVE_EXTRA_HEADERS is silently dropped under sudo
Opened by stack72 · 10/19/2026· Shipped 10/19/2026
Follow-ups from the post-merge adversarial review of swamp-club/swamp#3191 (swamp-club#3575).
1. An unreadable --ca-cert passes enable, then the service restarts forever
validateCaCertFile in src/cli/commands/worker_daemon.ts only stats the path: it checks that the file exists and is a regular file, but never reads it. A CA file that exists but can't be read passes enable. Examples: mode 000, or a file owned by another user in --user mode. The service then fails on every start with 'Could not read CA certificate file' (getEnvCaCerts) and restarts forever, the exact failure #3191 says enable now prevents. The token files already get a real read through readTokenFile.
Fix: read the file at enable time and turn a read error into a UserError that names the resolved path. Optionally, also refuse a file that doesn't look like PEM.
2. SWAMP_SERVE_EXTRA_HEADERS is silently dropped under sudo
daemon enable now copies SWAMP_SERVE_EXTRA_HEADERS from the enabling shell into the service. A system-mode service is normally enabled with sudo, and sudo's default env_reset strips the variable. A user who exported the headers gets a service without them, with no warning. The worker is then refused at the reverse proxy (401/403) and keeps reconnecting.
Fix (recommended): document that system mode needs sudo -E or sudo --preserve-env=SWAMP_SERVE_EXTRA_HEADERS, both in the daemon enable help and in the manual (see swamp-club#3599). Optionally also print a hint when enable runs under sudo (SUDO_USER set) and the variable is unset. Weigh that against the noise it adds for sudo users who don't use headers.
Repro
- chmod 000 ca.pem, then: swamp worker daemon enable wss://host:port --user --token-file ... --ca-cert ca.pem. Enable succeeds, and the service then fails on every start.
- export SWAMP_SERVE_EXTRA_HEADERS='Tunnel-Token: x', then: sudo swamp worker daemon enable wss://host:port --token-file ... The service definition has no SWAMP_SERVE_EXTRA_HEADERS, and enable prints no extra-headers line.
Shipped
Click a lifecycle step above to view its details.