Datastore rework Phase 5: content-level authorisation for forwarded definition and evaluated-file writes
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
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
Datastore rework Phase 4 G: S3 and GCS extensions implement storage/1 chunk storage for v3
Datastore rework Phase 4 G: S3 and GCS implement the writable datastore-wide control plane and keep _control/writer/ at the bucket root
Scheduled flaky-test detection is failing
Datastore rework Phase 4 F: a durable outbox for v3 commits, the post-commit chunk check on recovery, and pruning compacted_txns
swamp worker list shows a worker as idle while its verify-on-enroll probe is still pending
Docs: say what the first run after a typeVersion upgrade writes to the definition file
Datastore rework Phase 4: close D2 follow-ups before v3 replication is switched on (lineage, messages, migration, chunk GC)
Datastore rework Phase 4: serve confirms each v3 write request is replicated before it answers (group commit)
@swamp/gcs-datastore: GcsLock.inspect() reports a failed read as no lock, so a GCS outage looks like a lost model lock
Datastore rework Phase 4 D2: restore, refresh and takeover from the v3 replica, with a checkout-local commits.db (dormant)
S3/GCS: a run refused for losing its model lock keeps its write dirty when the refresh can't reach the datastore, so a later sync pushes it
Docs: add PowerShell to Set Up Shell Completions
Add Windows installer to the homepage and manual
CopyCommand's clipboard fallback selects the wrong command on pages with several copies
README: add Windows to the supported platforms and its installer
install.ps1 closes the user's PowerShell window on failure when run via irm | iex
v3 first clone on Linux is 2.6x slower than v2: batch the catalog refresh during catch-up
Windows: no PowerShell completions subcommand
Windows: extension yank fails with API key auth despite extensions:* scope
Windows: registry rejects windows-x86_64 as a valid platform
Windows: update --check reports no binary available for windows/x86_64
Windows: extension push type field shows file path instead of exported type name
Docs: extension quality now reports repository-verified for private source hosting (swamp-club#3406)
Docs: choosing where a new workspace is created (--path, start page Location field, workspaces.dir)
Manual: broken anchor and tutorials teach deprecated swamp data get
Docs: serve-flags.md admin/allowed-user resolution is stale (pinned names, oauth:manage for lookups, plain usernames only)
swamp update --check fails with a raw [FTL] TimeoutError when the artifacts host takes over 5s
whoami reports each collective's private source hosting and namespace privacy, so the CLI quality rubric can match the registry's repository-verified verdict
Manual: working-with-data copy button copies a truncated data query
Error and help messages still say model under swamp behavior commands (follow-up to #3431)
CLI output still says model under swamp behavior commands
Manual: make behavior the primary term and command spelling
Docs: Layout Migration says repo upgrade deletes gen-2 files without re-pulling
Scheduled flaky-test detection is failing
Datastore rework Phase 4 D1: Litestream sidecar for v3 writers, and a write command waits for replication before it reports success (dormant)
Accept usernames for user subjects in grant files
Docs: swamp workspace commands and workspaces in the manual (swamp-club#3424)
Docs: document swamp start onboarding and the local dashboard
Docs: grant-file username: subjects in the swamp serve manual
Datastore rework Phase 4: the v3 writer lease requires an extension's explicit declaration that it keeps _control/writer/ at the root, not just a writable store's shape
Datastore rework Phase 4: real-endpoint check of Phase 4A's replication figures on a hosted S3-compatible service (spike)
Datastore rework Phase 4 E/G: a writable datastore-wide control plane so the v3 writer lease binds at the bucket root
Docs: serve-flags check-config row for bare restricted-model-types entries
Datastore rework Phase 4: measure Litestream replication on real S3 and GCS buckets (spike: per-command vs idle sidecar, cost of waiting for replication)
v3 writer lease: a stray or unpadded fence key under _control/writer/ wedges the lease
datastore lock status reports held: false for model locks on S3 and GCS datastores
Extensions accept export const behavior, extensions/behaviors/ and a behaviors: manifest key alongside model
Docs: grant and revoke changes reach every serve instance within one poll interval (S3/GCS and v2 filesystem)
S3/GCS: a run whose model lock was force-released still pushes, and one run's write is lost
rollbackOnFailure methods fail when run as a workflow step
Registry UI and manual say Behaviors, keeping the stored models content type
S3/GCS datastores: write data version files create-only so a second writer cannot overwrite an existing version
Datastore rework Phase 4: a fenced writer lease for v3 datastores, replacing Phase 3's writer lock
Workflow YAML, extension exports and serve grants accept the behavior spelling alongside model
Datastore rework Phase 4: download, verify and cache a pinned Litestream binary on first v3 use (dormant)
Serve dashboard uses behavior terminology, with old routes kept
Docs: Claude Code page says swamp always writes CLAUDE.md (changed by swamp-club#3346)
A pulled extension can shadow a built-in type, and removing it leaves serve without the built-in
Skills and generated agent guidance use behavior and swamp behavior commands
Docs: state the OpenCode version requirement for the swamp audit plugin
swamp behavior is the full preferred command group, with every swamp model spelling kept
DispatchService two-slot worker test assigns disabled Object.prototype.__proto__
Partial extension catalog saves delete rows for sources mounted from outside the repo
Datastore rework: a fresh v3 checkout is slow because catch-up fsyncs every file one at a time (27 s vs 1.1 s for 1,000 items on macOS)
Build each swamp model command from a factory so behavior can share it (no visible change)
Design record: behavior is the product term for models, with model kept working
Docs: show the full --literal-inputs warning, including Raw:, in the model definitions reference
model method run --literal-inputs: the warning's Raw: text drops a brace from the expression
repo init --help omits pi and antigravity from the built-in --tool list
swamp model edit silently renames the target when the piped body's name differs
Add swamp behaviour run as the preferred model-method command
Datastore rework: on v3, an interrupted method run's outputs never reach other clones (SIGTERM should commit; SIGKILL must be visible)
Datastore rework: on v3, turning managedConfig on hides existing config (the default vault); give v3 its own config migrate
Datastore rework: on v3, namespace set before setup --format 3 fails without --skip-migration, and namespace list shows no namespaces
S3/GCS datastore sync: shared sync service lets one sync clear another's dirty marks and pull over unpushed files
Docs: --literal-inputs and data that never evaluates as authored (swamp-club#3205)
Relationships
#3377 S3/GCS datastores: write data version files create-only so a second writer cannot overwrite an existing version
Opened by stack72 · 10/13/2026
Background
swamp-club#3373: on S3 and GCS v2 datastores, a run whose model lock was force-released (swamp datastore lock release --force) still pushed. Each clone allocates the next data version from its own cache, so the old holder and the new holder both wrote version N+1 under the same key (<type>/<modelId>/<dataName>/<N+1>/). The later upload overwrote the earlier one. Both runs exited 0 and one acknowledged write was lost.
The overwrite happens inside the extensions' sync. pushChanged, preparePush and commitPush upload with a plain put, so the last writer wins.
What swamp-club#3373 does in core
Before each push under per-model locks, core re-reads each lock and compares it with its reading at acquire: holder, hostname, pid and nonce. If the lock was lost, core refuses the push and fails with model_lock_lost.
That narrows the window but cannot close it. The check and the upload are not atomic, so a breakglass and a takeover that land between them can still lose a write. Phase 5's model leases close it in the long run.
Proposal
Make the S3 and GCS sync services write data version files create-only:
- S3: PutObject with
If-None-Match: *. - GCS:
ifGenerationMatch=0.
That covers the files under <type>/<modelId>/<dataName>/<version>/. A second write of a version that already exists then fails instead of overwriting, whatever happened to the locks.
Things to settle
- Retries and re-publishes. The publish-and-verify loop in core (swamp-club#3146) re-stages the same version. A precondition failure where the remote bytes equal the local bytes must count as success, not as an error.
- Which keys stay overwrite-in-place. The
latestmarker, the index and other mutable files must keep their current behaviour; only immutable version files become create-only. - Endpoints without conditional writes. Some S3-compatible endpoints don't support
If-None-Match. S3Lock already falls back forIf-Match; this needs a matching fallback and a warning. - The in-memory remote fake. The fake in
packages/testing/in_memory_remote.ts(swamp repo) should model the new semantics so core tests can pin them. - What the losing writer sees. It should fail with a clear error naming the version that already exists.
Closed
No activity in this phase yet.
system commented 10/13/2026, 6:00:38 PM
Classified automatically when this issue was filed.
- Source: Extensions
If you feel this classification is incorrect, add a ripple to tell us so.
stack72 commented 10/16/2026, 3:32:18 PM
Closing as covered, per the design note from the #3508 attempt. The overwrite needs a deliberate lock release --force mid-run and then a push landing between core's lock check and the upload. swamp-club#3373 refuses the push when the lock changed hands, and #3485 discards the refused run's write, which closes the wide part; Phase 5's model leases close the rest. Doing it safely in v2 turned into a new push protocol for every S3/GCS user (ownership log, rollback, takeover age, conditional deletes, pre-commit re-check, about 2,700 lines), which is too much risk for that window. The parked work (decision table, held-versions log, model test) is on swamp-extensions branch 3508, commit 9e3493612, for reference. The model test found two bugs on main that stand on their own: the stale commitSeq after a no-op commitPush (already #3193) and the pull mtime shortcut (#3546).
Sign in to post a ripple.