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)