Skip to content

Changelog

Versions: 0.8.0, 0.7.0, 0.6.0, 0.5.0, 0.4.0, 0.3.0, 0.2.0, 0.1.1, 0.1.0.

0.8.0 (2026-09-22)

Features

  • a tick on a drifted row that nothing picked up is swept like any other (6d0d3b3)
  • drift in the diff, the hash, config and the Pulumi adapter (record 0055) (8904add)
  • fixture scenarios with real drift, recorded through a streamed preview-only refresh (8d99135)
  • rebuild dist for drift (61f8d2c)
  • record 0055 and the docs for drift (03ac9e6)
  • scans check drift, resolve carries it, apply checks it again and repairs it (af58921)
  • the check summary lists drift among the known keys (d27e459)
  • the deploy a merge hands to apply carries drift when its hash covers it (037d93a)
  • the drift row, the Drifted section and the drift header picture (5d103f5)

0.7.0 (2026-09-22)

Features

  • a tick on an update waiting to merge merges it and opens a record that deploys after the merge (slice 4.2) (f554990)
  • merge and deploy in the e2e, the docs, record 0054, and dist (slice 4.2) (d2cc931)
  • merge and deploy next to stack dependencies: no merge while a dependency waits, and an apply job for the scan’s matrix (slice 4.2) (aeacf17)
  • mergeAndDeploy.authors, the qualification rule and the merge row (slice 4.2) (3e704e8)
  • the merge record, merge ticks in the edit history, and the pull request calls of the port (slice 4.2) (ed01f0d)
  • the scan lists updates waiting to merge and hands a merged change to apply (slice 4.2) (cacf7aa)

0.6.0 (2026-09-22)

Features

  • a three stack chain goes round the whole loop on the fake, in order (3ba64ad)
  • dependsOn in sluiceway.yaml, checked against discovery, circles refused (263aa8c)
  • queued rows survive a scan, and apply never deploys a queued record (31960da)
  • rebuild dist for stack dependencies (6389019)
  • record 0056, the config reference for dependsOn, glossary terms, and resolve on workflow_dispatch in the workflows (6af36c3)
  • resolve refuses a tick whose dependency has a change waiting, queues the rest of a chain, and a dispatched resolve starts what is ready (ddc303a)
  • settle starts the next layer and ends a queued record whose dependency did not deploy (b68bd7d)
  • the dependency rules: refused, started and queued ticks, and when a queued record is ready (633235f)
  • the e2e runs a chain of three stacks, one layer per run, with the real tool (c1018ad)
  • the queued row state, counted as deploying, and the note on a tick refused for a dependency (2bd65af)

0.5.0 (2026-09-22)

Features

  • header: small fish upstream of Penny, more as the water rises (9155a60)
  • OpenTofu stacks are declared in sluiceway.yaml and found from their files (record 0053) (757a9ae)
  • the adapter interface grows preparations and a saved plan (record 0053) (cb3e13f)
  • the OpenTofu preview, tofu plan -out and show -json folded into a diff (record 0053) (2b25bdc)
  • tofu init before the pool, the deploy of exactly the saved plan, and the tool diff (record 0053) (644b07e)

0.4.0 (2026-09-22)

Features

  • small polish from real use (slice 2.22) (1d14d23)

0.3.0 (2026-09-22)

Features

  • apply: a change that moved since the tick is told to the ticker in one comment (slice 2.20, part 4) (a8ff4a8)
  • apply: an empty fresh preview ends as success, nothing to deploy (slice 2.20, part 3) (84fa132)
  • apply: dry-run rehearses a tick and deploys nothing (slice 2.20, part 5) (34311b2)
  • config: an ignore entry may give a reason, listed under In sync (slice 2.20, part 1) (7ae4999)
  • config: deploys: false stops every deploy (slice 2.20, part 2) (373b130)
  • dashboard.showValues, an allowlist of paths whose values may appear (slice 2.19) (2ea116c)
  • slice 2.21, two checks: the UI tick event and stdout diagnostics on a failed preview (2d3fc3a)
  • the diff hash covers the values a row shows (record 0052) (947f115)

0.2.0 (2026-09-22)

Features

  • a preview page per pending stack, the page a row’s preview link lands on (slice 2.18) (d9f4e11)
  • scan: a failed list of check runs stops the preview pages with one log line (e53d243)

0.1.1 (2026-09-21)

Bug Fixes

  • find the action’s own version next to its bundle, not through GITHUB_ACTION_PATH (5018c8a)

0.1.0 (2026-09-21)

Features

  • action: a branding block for the Marketplace, the droplet on blue (fcaaedf)
  • adapters: a stack that does not exist in the backend is a failure reason of its own, picked from exit code 6 (5dfccea)
  • adapters: changed keys are property paths as the tool writes them (65ab41c)
  • adapters: slice 1.4, Pulumi discovery (1b9cc20)
  • adapters: slice 1.5, Pulumi preview (78e4195)
  • adapters: the adapter interface and Pulumi discovery from files alone (2d9da4a)
  • adapters: the process runner with the time limit, and the tool environment (b49bab4)
  • adapters: the Pulumi adapter’s apply: up with the preview’s quiet flags, the outputs kept to the tool, and no time limit of Sluiceway’s (b866188)
  • adapters: the Pulumi version check and preview (ce27034)
  • add action metadata with the inputs the decision records fix (3811f9d)
  • check is the fifth mode, in the dispatch and in action.yml (3139526)
  • config: dashboard.readOnly, for a workflow that only scans (80af3e7)
  • core: add the diff hash over a canonical document (3a8e9b0)
  • core: add the Stack, Change and Diff types and the derived stack id (3e5b0f8)
  • core: attribution: the range of a stack, the pull requests and direct pushes it claims, the line and its counted form (9cd5c8f)
  • core: deployment records: the task, the versioned payload, deploy facts and the row a stack gets at the late read (a96bb5b)
  • core: ignore on the stack id, one id per stack, and applyConfig drops ignored stacks (cd4b088)
  • core: parse sluiceway.yaml with defaults and its own error messages (30d7918)
  • core: read sluiceway.yaml from the repo root and refuse sluiceway.yml (396cf66)
  • core: slice 1.1, core types and the diff hash, render/ inside the boundary (edfef8e)
  • core: slice 1.2, config loading and the JSON schema (4e4b3bf)
  • core: the bounded pool a scan previews through (8d1805f)
  • core: the check: what ignore leaves out and the glob that would work, the files no stack claims, the globs offered for scan.unrelated (2683889)
  • core: the claim rule and the scan plan of a narrowed scan (b0c7a6c)
  • core: the open deployment records of one run, which settle ends (1f09fd1)
  • core: the orphan tick rule of a scan: carry, sweep, preview first, and when a resolve run is on its way (d207d4b)
  • core: the preview failure reasons of record 0022 and their text (f6bac46)
  • core: the reasons a deploy fails, from the fixed list of record 0022 (f5e52c6)
  • core: the tick rule: levels from the three booleans, a list that only narrows, only a person can tick (6fcbdfe)
  • core: the walk through the edit history that names the ticker of a tick (c8cefa8)
  • dispatch on mode to stubs that fail as not implemented yet (c01e756)
  • examples: add the pulumi-basic example project (83ad250)
  • generate the JSON schema of sluiceway.yaml and check it in CI (d2fa09c)
  • github: a workflow dispatch on the port, on Octokit, on the fake and on its server, and the fake starts an event for a person’s edit (ea0cfcb)
  • github: deployment records on the port and on Octokit: create, statuses with auto_inactive false, one GraphQL page, the REST fall back, a workflow run (d1e11e6)
  • github: finding, repairing and creating the dashboard (e9bb101)
  • github: judge the ticks of a run against the live lookup, and write the one comment (0f2cb11)
  • github: one deployment record by its id, on the port, on Octokit, on the fake and on its server (9e23360)
  • github: slice 1.10, the GitHub port, the fake, the dashboard and the write loop (fcc52a6)
  • github: step outputs, the result file under RUNNER_TEMP, and the dashboard url from the event (49a6347)
  • github: the action ref rule, exact tag or commit SHA and never a moving tag (997d441)
  • github: the bounded reads of deployment records, and an open deployment whose run is over becomes error (2036050)
  • github: the compare call on the port, on Octokit and on the fake (a96ba6b)
  • github: the edit history on the port, on Octokit, on the fake and on its server (2d7c9f9)
  • github: the fall back of the bounded reads can name its stacks only when a page is full (c44efb3)
  • github: the GitHub port and the fake GitHub with the lab’s size limits (34ea351)
  • github: the job knows the file name of its workflow (0ed3134)
  • github: the job-id input from job.check_run_id, and the run attempt with the job’s facts (bc92340)
  • github: the Octokit implementation of the port (14e2d99)
  • github: the permission lookup on the port, on Octokit and on the fake (d28ebc2)
  • github: the runs an issue edit started, on the port, on Octokit, on the fake and on its server (23df7a2)
  • github: the walk of the lookback and the files of one commit, on the port and on Octokit (d5ef061)
  • github: the write loop, which reads back every write and tries three times (e42d8e8)
  • header: one crate per pending stack up to 12, and the destroy sign on a pole (2e4fd33)
  • header: the destroy sign on the pending and deploying pictures, and the plain files are gone (201e58b)
  • header: the wide quay header, sixteen files of 880 by 160 (add6877)
  • modes: a scan that follows a push previews only the stacks that claim a changed file (28a1dac)
  • modes: after a change to sluiceway.yaml the log says the config file changed, not that no stack claims it (0033a1b)
  • modes: apply is wired: the deployment-id input in action.yml, required in apply and an error in every other mode, and the job glue (929fb47)
  • modes: apply sets outcome, stack, dashboard-url and the result file, and settle sets dashboard-url (761717f)
  • modes: apply warns too when scan.logDiff is on in a public repo (bd53496)
  • modes: apply: the record first, a fresh preview, the hash check, the deploy, the status and the row swap (3502b2e)
  • modes: resolve is wired: the job glue, the matrix output in action.yml, and the refusal, rescan and cap tests (8802010)
  • modes: resolve works the attribution line out again for the deploying row it writes, from a scan-sha that is a commit id (9e0c038)
  • modes: resolve: the cheap payload check, body and history in one read, records created as queued, the matrix output before the row swap (00bdf8a)
  • modes: scan sets its outputs on every way out and writes the result file (2ccb021)
  • modes: scan, resolve and apply draw a read-only dashboard, and a read-only scan drops old ticks without a note (e2b37a8)
  • modes: scan.logDiff prints the tool’s own diff of every pending stack in its log group (1839d7c)
  • modes: settle ends the open records of its own run and starts a full scan (be223a8)
  • modes: settle is wired as a mode (4de84d1)
  • modes: the check mode: config, discovery and the files no stack claims, in the job log and the summary, with no port and no process runner (180ed53)
  • modes: the full scan, with the pool, the job result and the job log (c992b07)
  • modes: the scan puts the attribution line on its rows and the pull requests in its summary, and never fails over it (978b7c0)
  • modes: the scan reads the deployment records at its late read: deploying rows, failure lines, recently deployed, and it defers to a deploy that ended under it (cbd3684)
  • modes: the scan sweeps orphan ticks at its late read, and keeps its hands off while a resolve run is on its way (a807a95)
  • render: a pending row can carry a tick through (3995511)
  • render: a read-only dashboard draws no boxes and says so under the Pending heading (724183f)
  • render: a row shortens long property paths and lists ten per change in its fold (3d70074)
  • render: a row’s link lands on the attempt’s summary or the job’s log, and the summary has an index and an anchor per stack (caf3ea6)
  • render: escape text from outside, and write times in UTC to the minute (0929d64)
  • render: slice 1.6, markers and rows (1c03412)
  • render: slice 1.7, the body (ba2e349)
  • render: slice 1.7b, the wide header in the body renderer (0ac39cd)
  • render: slice 1.9, the summary and the log text (9fa347f)
  • render: the body around the row blocks, personality on and off (7b9e021)
  • render: the budget of the summary, its levels and the note at the top (b4b64e4)
  • render: the destroy sign as a pure function of the row markers (ca538c3)
  • render: the header always shows the real state, and a destroy adds a sign (ca69615)
  • render: the header state, six states and bad news wins (d0ea53e)
  • render: the last full scan on the root marker (1cf23e7)
  • render: the level of a shortened row on its marker (c3a6538)
  • render: the log text of a diff, and the title of a stack’s group (4ac839d)
  • render: the note about shortened rows, counted from the row markers (da6123f)
  • render: the one comment for the refused ticks of a run (14c1cc7)
  • render: the pending level of record 0039 (943b963)
  • render: the result file of a scan and of an apply, its strict schema, and the dashboard counts from the row markers (41fa2f2)
  • render: the row renderer for every kind of row, redact and the four levels (574ef68)
  • render: the size budget, biggest rows first, give-back, destroys last (97afbd4)
  • render: the summary names the ignore glob that takes a stack off the dashboard when it does not exist in the backend (141f7b1)
  • render: the summary of a scan, every previewed stack in full (b4965e9)
  • render: the summary of an apply, and whether a deployment record is still open (1ebe1e0)
  • render: the three marker kinds, value encoding and reading a body (aefbe4f)
  • render: the voice in two lines, and the plain lines around them (d6aa5e6)
  • scan: log the number of GitHub API requests the scan made (25425be)
  • scripts: add the fixture recorder and its scenarios (4eb95c2)
  • slice 1.3, the example project and the fixture recorder (695e454)
  • the outputs of record 0041 in action.yml, and the job glue that hands the modes RUNNER_TEMP and the event (fc44971)
  • the scan wired into the entry point, with its inputs, job facts and job log (134c3e3)

Bug Fixes

  • adapters: an empty detailed diff falls back to the tool’s list of names (acb9142)
  • core: one form of the failure reason, the lower case one of record 0027 (59a3a26)
  • make the first release 0.1.0 instead of 1.0.0 (b8a9b81)
  • make the first release 0.1.0 instead of 1.0.0 (bff83a8)
  • modes: one full stop after GitHub’s words in the attribution log line (9766956)