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)
Docs: say that validation applies the upgrade chain before checking global arguments
datastore setup strands repo-local audit history and run logs in the new datastore
Datastore rework Phase 3: opt in to v3 for new filesystem datastores (single writer), and wire v3 into CLI and serve (no v2 behaviour change)
classifyConnectionError mislabels non-auth connection failures as auth failures
Docs: datastore reference says audit logs and telemetry live in the datastore
Datastore rework Phase 3: a v3 home for audit, telemetry, logs and files, dormant (no behaviour change)
s3-datastore: first push on a fresh cache prints 'Index merge failed' for a missing local .datastore-index.json
Datastore rework Phase 3: history compaction so superseded chunks can be reclaimed, dormant (no behaviour change)
Windows: extension install legacy migration finds zero files
Windows: worker daemon status reports not installed (no systemd/launchd)
Windows: extension rm joins repo dir with already-absolute bundle path
Datastore rework Phase 3: workflow run and vault config repositories stage typed changes on v3 (no v2 behaviour change)
Windows: cancelled step records error suffix that POSIX does not
Run GC never removes run logs when a non-default datastore is configured
Windows: check-config --grants-file and --grants-dir still output backslash absolute paths
Datastore rework Phase 3: definition, workflow and evaluated repositories stage typed changes on v3 (no v2 behaviour change)
Windows: datastore compact fails with database is not open
repo init: create a default local_encryption vault, and stop persisting absolute base_dir in vault configs
Relationships
#3302 swamp model edit silently renames the target when the piped body's name differs
Opened by stack72 · 10/12/2026· Shipped 10/12/2026
Summary
swamp model edit <name> applies the whole piped body, including the
name field. When the body's name differs from the addressed model, the
model gets silently renamed. No warning, no diff, no confirmation.
Repro
- Create a model named
foo. - Author a definition file whose own top-level
name:isbar. - Run
swamp model edit foo < bar.yaml. swamp model get foonow resolves to nothing.swamp model get barresolves to the model that used to befoo, with all its prior state intact under the new name.
Impact
Hit this for real on 2026-10-12. A shared, 105-record @swamp/software-factory
instance named platform-team got renamed to platform-team-template by a
routine model edit platform-team < factories/platform-team-template.yaml
call, whose only intent was refreshing globalArguments. The piped file's
own name: field happened to differ.
Every bare-name call against platform-team then failed to resolve. A
downstream auto-create-on-missing fallback in our own extension code
created a fresh, empty model under the freed name. Several webhook nudges
then wrote real work onto that decoy: classify, plan, and two rounds of
plan-review. Nobody caught the mismatch until later.
Suggested fix
model edit should refuse, or require an explicit --allow-rename flag,
when the piped body's name differs from the model_id_or_name argument
that named the target. A rename is a deliberate, identity-affecting
operation. It should never happen as a side effect of a content patch.
Automoved by swampadmin from https://github.com/swamp-club/swamp/issues/3020
Shipped
Click a lifecycle step above to view its details.