Decision records
Each record explains one decision about Sluiceway and why it was made. A later record can amend or supersede an earlier one, and the last column says which.
| Record | Decision | Amended or superseded |
|---|---|---|
| 0001 | Drive Pulumi through the CLI, not the Automation API | Amended by 0055 |
| 0002 | Sluiceway renders the diff itself from the normalized diff | |
| 0003 | Deploy facts live in GitHub’s Deployments API | Amended by 0051; Amended by 0056; Amended by 0054 |
| 0004 | The issue body is a cache of row blocks, written without a lock | Amended by 0011; Amended by 0035 |
| 0005 | Every tick keeps its own event, and nothing deploys without a named ticker | Superseded by 0025 |
| 0006 | “Stack” is Sluiceway’s own word, and a stack’s id is derived, never chosen | Amended by 0053 |
| 0007 | A change says what happens to the real object and, separately, what happens to the tool’s record of it | Amended by 0046; Amended by 0052; Amended by 0053; Amended by 0055 |
| 0008 | The diff hash covers exactly what the row shows, no more and no less | Amended by 0055; Amended by 0023; Amended by 0052; Amended by 0046 |
| 0009 | Three marker kinds, a trailing row marker, and a body that is regenerated around its row blocks | Amended by 0054; Amended by 0055; Amended by 0027; Amended by 0028; Amended by 0035; Amended by 0056 |
| 0010 | Push scans are narrowed by a claim rule that fails open | Amended by 0051 |
| 0011 | A narrowed scan swaps its own rows, and every scan ends with one row per discovered stack | |
| 0012 | A scan is one job that previews through a bounded pool, not a matrix of jobs | |
| 0013 | The workflow prepares the environment, and Sluiceway never wraps or hooks the tool | |
| 0014 | “Never hold credentials” is five promises that can be checked | |
| 0015 | No generic tool arguments, only named adapter options | Amended by 0055 |
| 0016 | Deploys outside Sluiceway are legal and not detected | |
| 0017 | The bot is always the workflow’s own token | Amended by 0025; Amended by 0050; Amended by 0054 |
| 0018 | A tick is authorized by one live rule that only narrows, and only a person can tick | Amended by 0025; Amended by 0051; Amended by 0054 |
| 0019 | Apply runs only on an open deployment record, so a fresh tick is the only retry | Amended by 0025 |
| 0020 | The tick is always a gate, and GitHub Environments make it a stronger one | |
| 0021 | No property value ever leaves the adapter | Amended by 0037; Amended by 0046; Amended by 0048; Amended by 0050; Amended by 0052 |
| 0022 | The tool’s own words stay in the job log, and nothing is masked by guessing | Amended by 0048; Amended by 0051; Amended by 0056 |
| 0023 | Redact strips the issue, not the summary, and the hash still covers the whole diff | Amended by 0052 |
| 0024 | A replace or delete gets a guaranteed place on the row, not more data | |
| 0025 | The edit history names the ticker, and the event is only a wake-up | Amended by 0054 |
| 0026 | Attribution names the pull requests a stack claims and only counts the rest | Amended by 0037; Amended by 0054 |
| 0027 | Deletes and replaces sit open under the row, everything else is folded | Amended by 0044 |
| 0028 | The size budget shortens the biggest rows first, gives back what fits, and never lists half the destroys | |
| 0029 | The body puts pending first and folds away only what is calm | Amended by 0040; Amended by 0051; Amended by 0055 |
| 0030 | The mascot is the gate itself, and its name is Penny | Amended by 0038 |
| 0031 | The header has six states, bad news wins, and any delete or replace turns it plain | Amended by 0038, 0039; Amended by 0055 |
| 0032 | The voice lives in two lines and stops at the first sign of trouble | Amended by 0043 |
| 0033 | The state images are twelve small files named by role, served from the exact release tag | Amended by 0039, 0040; Amended by 0055 |
| 0034 | dashboard.personality: false removes the image and the voice | Amended by 0043 |
| 0035 | resolve hands apply a deployment record, and settle finds its own | Amended by 0056; Amended by 0054 |
| 0036 | A change that touches only a stack’s outputs is not shown in v1 | |
| 0037 | The summary has a budget too, and the job log holds what does not fit | Amended by 0044 |
| 0038 | Penny stands mid-channel on a wide quay, and failing is a jam | Amended by 0047; Amended by 0043 |
| 0039 | Pending has three pictures, picked from the pending count, which makes sixteen files of 880 by 160 | Superseded in part by 0047; Amended by 0043 |
| 0040 | The header and the two lines under it are centered, and every count has a dot | Amended by 0043 |
| 0041 | Observability is outputs and a result file, and Sluiceway sends nothing | Amended by 0051; Amended by 0055 |
| 0042 | A check mode validates a setup with no credentials and no tool | |
| 0043 | The header always shows the real state, and a destroy adds a sign to the same picture | Amended by 0047; Amended by 0055 |
| 0044 | A row’s link lands on the page that holds the stack, and the summary has an index | Amended by 0048; Amended by 0050 |
| 0045 | A read-only dashboard draws no boxes | |
| 0046 | A key is a property path, and a row shortens it without ever showing a value | |
| 0047 | Pending shows one crate per pending stack up to twelve, and the destroy sign stands on a pole | Amended 2026 |
| 0048 | The tool’s own diff may reach the job log, when a repo asks for it | Amended by 0050 |
| 0050 | A pending row links to a preview page: a check run with the stack’s diff | Amended by 0052 |
| 0051 | A team can stop, rehearse and explain, and an empty fresh preview is not a failure | |
| 0052 | A repo may list the property paths whose values appear, and nothing is guessed | |
| 0053 | OpenTofu stacks are declared in sluiceway.yaml, initialised one directory at a time, and deployed from the plan that was hashed | |
| 0054 | One tick merges a listed update, and the scan after the merge hands its diff to apply | |
| 0055 | Drift is checked by a scheduled scan, shown on the stack’s own row, and repaired by a tick | |
| 0056 | A stack waits only on the stacks it names, and a chain deploys one layer per run |