Skip to content

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 17:46

v0.4.0 (2026-10-26)

Features

  • seams: A promotion's body, a channel's name in the store, and a chain that says how it was read (2b28ede)
  • seams: The refusals a promotion gives: a claim wanting, a channel elsewhere, a version its bound channel never held (f3a5078)
  • fakes: The fake keeper answers a chain as last read once it cannot be reached (693de7e)
  • core: The gate's ask and answers (fc186b3)
  • core: The gate judges in the order of its design (5361ad8)
  • core: The gate counts each claim with acceptance's joins (630f87b)
  • core: The gate counts an independent rebuild, never makes one (b56b8b4)
  • signer: A KMS key named by its key ARN (dc1d6ea)
  • signer: Sign and verify with a KMS key through the host's role (62b2619)
  • core: A chain read as last read moves no channel's name (d95a2f9)
  • core: A promotion judged under its channel's policy, held by the ledger before the store (4c0b5b3)
  • ledger: The git ref ledger, a commit per claim on refs/tailrace/ledger/ (d5b0dbd)
  • ledger: The store ledger, a chain walked by predecessor from the channel's name (6328a6b)
  • bindings: The host's file binds the ledger with [ledger] (8b8e8c7)
  • bindings: [signing] names a host key or a KMS key, read by the signer family (b0a8ca5)
  • cli: Tailrace promote moves a channel, or back with --back (b144309)
  • core: The gate never accepts what it offered, but on the one host (8fc1523)
  • core: The channels that follow each publish, read from the policy file (6a19af6)
  • core: Nothing the gate accepted is un-accepted (2f92901)
  • core: The gate judges each following channel under its own policy (8c02f8f)
  • policy: The policy seam lists the channels, each with its component and binding (131) (1b8d7ac)
  • core: Status answers every channel from the ledger beside the host's record (31, 36, 131) (5d21ff0)
  • core: The serving address and a repository's name from its remote (49, 114) (e2879e1)
  • core: Status answers the environments unread and a repository's row of heads (98, 132) (c01a0e0)
  • bindings: Status is bound to the landing, the policy and the ledger, and with no file as 118 binds a host (60, 118) (b0cf7b6)
  • core: The gate told by a publish judges the index the publish named (95, 130) (f26b864)
  • signer: The given host key is made on its first sign, its public half beside it (118, C.8; design D3) (b5e0d04)
  • signer: The given signer is named by its public half, else by the host's first label (118, 11; design D4) (6a6e9f1)
  • bindings: A table the file leaves out is made by its family and named as given (118; design D2) (d427c5e)
  • store: The given store is the layout under the user's data directory (118, C.2; design D2) (faad480)
  • landing: The given landing is sluice where HEAD holds sluice's file, a branch otherwise (118, C.5, C.6; design D2) (1f6c072)
  • ledger: A file naming no [ledger] binds the git ref with no remote (118, C.13; design D2) (38890d7)
  • signer: A publish or a promote naming no [signing] signs with the given host key as the host's name (118, C.8; design D2, D3, D4) (ab688f7)
  • bindings: The host's file names what tells its gate with [gate] (118, 130) (fd6adad)
  • cli: Publish tells the host's gate where the host's file binds it to (95, 108, 130) (e1868fa)
  • cli: Status shows every channel and its chain beside the environments and the host's record (31, 36, 58 to 61) (41a7c3f)
  • cli: The host's file of named repositories and the serving process found or started (62, 114, 132) (14d1e46)
  • bindings: A file naming no [gate] binds the host's publish to tell its own gate (118, 130) (a49af97)
  • landing: The given landing reads the checkout's origin, else its one remote, else its own refs (118; design D5) (a6bc8d6)
  • bindings: A missing file or table binds the given profiles for every command, status among them (118; design D1, D2, D8) (bee4222)
  • core: Where the policy names no gate, the gate's own identity is the one host (118, 108; design D7) (38c52ea)
  • seams: A channel is its component and name, and the policy says how each moves (125, 131) (a2f80d0)
  • cli: Tailrace serve answers each named repository's status as JSON and as a page (57, 114, 132) (a2a11c2)
  • cli: The serving process answers every repository it knows together at its root (132) (b8903b3)
  • cli: Status --page names the repository, finds or starts the host's process, and prints its page (114, 132) (51e218b)
  • core: Status answers every channel from the ledger beside the host's record (31, 36, 131) (6828db0)
  • core: The serving address and a repository's name from its remote (49, 114) (bdce0c1)
  • core: Status answers the environments unread and a repository's row of heads (98, 132) (e9ba3ce)
  • bindings: Status is bound to the landing, the policy and the ledger, and with no file as 118 binds a host (60, 118) (7196aca)
  • cli: Status shows every channel and its chain beside the environments and the host's record (31, 36, 58 to 61) (bb2e9cf)
  • cli: The host's file of named repositories and the serving process found or started (62, 114, 132) (25ad441)
  • cli: Tailrace serve answers each named repository's status as JSON and as a page (57, 114, 132) (3ec4b9e)
  • cli: The serving process answers every repository it knows together at its root (132) (c69c7a3)
  • cli: Status --page names the repository, finds or starts the host's process, and prints its page (114, 132) (2268998)
  • policy: The given channels are a fragment laid beneath the policy file, switched on and overridden by one line (C.10) (1458788)
  • core: The policy in force at the branch's landed head, each part and each channel its own answer (82, 131, C.10) (8900000)
  • cli: Tailrace policy shows the policy in force at the branch's landed head (82, 131, C.10) (519cc05)
  • ledger: A file naming no [ledger] keeps the chain on the landing's remote, so a second machine reads it (118, C.13; design D2) (8b026cc)
  • signer: The given host key is under the user's data directory, beside the given layout (118, C.8; design D2) (6b2c4b5)
  • store: A publish or a push makes its layout at the store's first operation, never in binding it (60, 118, core.11) (85ad2a6)
  • policy: A file naming no gate answers its one provenance signer as the gate (118, 108, C.10; design D7) (300716f)
  • policy: Several publishers and no gate are refused in the policy's words, and the gate accepts nothing (108, C.10; design D7a) (b100f96)
  • seams: A revision not landed as last fetched is a refusal of its own, saying when and to ask again (59, 77) (72cf308)
  • seams: The landing's answers say how each was read, from the landing or its copy as last fetched (59 to 61, 77, C.5, C.6) (f4852f7)
  • core: Status's channels say how the landing read the branch's head (36, 60, 77) (3f63ce3)
  • landing: The plain branch keeps a copy of each branch it fetches, and answers from it where the remote does not (60, 77, 78, C.6) (8bb5b67)
  • landing: Sluice keeps a copy of its logs and run records at each read, and answers from it where the remote does not (60, 77, 78, C.5) (9e91f47)
  • cli: Status names the landing read as last fetched under the branch, with the remote's words (36, 57, 60, 77) (7068da0)
  • cli: The repository's page names the landing read as last fetched, as the command line does (57, 77, 132) (7ba80b9)
  • seams: A revision not landed as last fetched is a refusal of its own, saying when and to ask again (59, 77) (d5f9de2)
  • seams: The landing's answers say how each was read, from the landing or its copy as last fetched (59 to 61, 77, C.5, C.6) (25ba081)
  • core: Status's channels say how the landing read the branch's head (36, 60, 77) (3beaf5e)
  • seams: A following channel says whether it takes prereleases, and a channel's policy names who may ask (C.10, 32, 129) (91a55d0)
  • core: A prerelease moves only the channels that take prereleases, and the gate asks its own move (95, 131, C.10) (db69ba9)
  • core: Only an approver asks for a channel whose policy names approvers (32, C.10) (4d66cef)
  • policy: The fragment marks the givens it holds off, a following channel takes prereleases where its line says so, and approvers name who may ask (C.10, 32, 37) (e781fd4)
  • seams: An empty chain read as last read is a chain of no claims saying when (60, 121) (62dce75)
  • ledger: An empty channel read from the copy says when it was read (60, C.13, C.14) (4ea0f8d)
  • core: An empty channel carries how it was read, and status prints one read from the copy as last read (60) (56f51bb)
  • cli: Tailrace policy shows a following channel taking prereleases and who may ask for each (C.10, 32) (02acd5f)
  • seams: The channels answer carries the givens held off apart from the channels in force (131, C.10) (63dc566)
  • fakes: The fake policy holds off the givens a test scripts, carried in its channels answer (C.10) (0e1dacc)
  • policy: A manual environment names who may say yes, and the channel it makes takes its approvers (C.10, 32) (b1e299e)
  • policy: An environment's table holds C.10's words and no others (C.10) (dfd39b0)
  • policy: The policy file's channels answer holds off each given not switched on, with the line that switches it on (131, C.10) (b3d6840)
  • core: The policy in force carries the givens held off beside the channels, from one channels answer (131, C.10) (f2d9d44)
  • cli: Tailrace policy shows the givens held off beneath the table, each with the line that switches it on (C.10, 131) (56732fe)
  • core: The gate told by a publish judges the index the publish named (95, 130) (a897fc4)
  • bindings: The host's file names what tells its gate with [gate] (118, 130) (0c9eb7c)
  • cli: Publish tells the host's gate where the host's file binds it to (95, 108, 130) (07b3f39)
  • bindings: A file naming no [gate] binds the host's publish to tell its own gate (118, 130) (3b8b059)
  • seams: A channel is its component and name, and the policy says how each moves (125, 131) (e14461c)
  • policy: The given channels are a fragment laid beneath the policy file, switched on and overridden by one line (C.10) (c950336)
  • core: The policy in force at the branch's landed head, each part and each channel its own answer (82, 131, C.10) (7024da5)
  • cli: Tailrace policy shows the policy in force at the branch's landed head (82, 131, C.10) (748722c)

Fixes

  • core: Only an acceptance the gate may make is the gate's already (95bc7b2)
  • devenv: A take outside the shell finds the config the hook was built with (3baa3f3)
  • adr: The key service signer's record is 0017 (9c7aac3)
  • core: The gate's move of a channel signs the one promotion body and follows channel/ (31b12db)
  • cli: Status opens the file's store only for a ledger held in it (60, 118) (afb8dff)
  • cli: Each promotion names its predecessor and the claims that satisfied its policy (33, 105) (0bd8554)
  • policy: An environment's after answers only for the names it writes itself (5649d88)
  • policy: An environment's after answers only for the names it writes itself (0198f95)
  • policy: Approvers on an auto environment is the statement's own, refused naming the field (C.10) (a6c3773)

Refactors

  • core: Verify's telling reachable from the crate (d9e5140)
  • seams: How an answer was read is every seam's, not the keeper's alone (60, 61, 77) (2afc66f)
  • seams: A moment reads as a time in UTC beside how an answer was read (57, 77) (abd2b0a)
  • core: The gate reads a policy naming no gate as it reads any policy; the given gate is the policy file's answer (118, C.10, core.7; design D7) (0698db7)
  • seams: How an answer was read is every seam's, not the keeper's alone (60, 61, 77) (39af1ab)
  • seams: A moment reads as a time in UTC beside how an answer was read (57, 77) (324bedc)

Documentation

  • openspec: Propose the-ledger-and-promotion (cda26de)
  • openspec: The-ledger-and-promotion hands the channels list and 125 to the policy seam's unit (8e4cee8)
  • openspec: Propose the-gate-accepts-under-the-policy (cc9e4e4)
  • openspec: Propose the-signer-in-a-key-service (7c2acfc)
  • adr: 0016 the key service signer takes a P-256 key by its ARN (db7d06b)
  • site: The key in AWS KMS is built, and [signing] kms beside the host key (652e857)
  • openspec: Archive the-signer-in-a-key-service (ec12054)
  • site: The self-hosting guide shows the gate and the channels that follow each publish (277e31d)
  • openspec: The gate's Touches declare the fakes' test (7ef9c62)
  • openspec: Archive the-gate-accepts-under-the-policy (9fa4928)
  • adr: 0016 the ledger's git ref holds one claim per commit, and a channel is named in the store (75bac6f)
  • site: Both ledgers built, [ledger] bound, and promote and back (3a3108b)
  • openspec: The ledger's unit declares the gate's paths it changed (e9e0295)
  • openspec: Propose the-policy-seam-lists-the-channels (e35a86e)
  • site: A channel belongs to one component and is bound within it (125, 131) (b85e1d8)
  • openspec: Archive the-policy-seam-lists-the-channels (46f17ed)
  • openspec: Archive the-ledger-and-promotion (55a4724)
  • openspec: A host with no bindings file is bound to the given profiles (118) (c264e18)
  • openspec: Propose status-on-any-machine (56f250a)
  • openspec: Status-on-any-machine answers every repository at the root, each whole at its own path (132) (6237830)
  • openspec: Status-on-any-machine keeps a repository's page at ///status, as Bolt 4 names it (31149a2)
  • openspec: Propose the-publishs-host-tells-the-gate (77ef522)
  • openspec: A host with no bindings file tells its own gate, reads its one remote, and is the gate where the policy names none (118) (12ef26d)
  • adr: 0019 the host names what tells its gate, and its publish step tells its own (41b1173)
  • site: The host's [gate] tells its gate, and beta moves on each publish on the one laptop (130) (c1bab0f)
  • openspec: A file naming no [gate] tells the host's own gate (118) (9bcb270)
  • site: Status shows every channel and its chain on any machine, the host's record beside them (31, 36, 61) (b050c9d)
  • openspec: Propose the-channels-answer-says-how-each-moves (039e54e)
  • adr: A file naming no [gate] binds the host's publish to tell its own gate (118) (a6d53f5)
  • adr: 0019 a channel is its component and name, and the policy says how it moves (92865ac)
  • architecture: Core.14 admits the host whose policy names no gate, its acceptance saying one host (118, 108) (0a82b5d)
  • adr: 0021 a host with no bindings file is bound to the given profiles (118, 108) (bf1db08)
  • openspec: A host with no bindings file is the gate through the policy file's answer, never the gate's code, and the command line binds it to the defaults (118, C.10) (ded1d77)
  • openspec: The publish's host's unit declares the ADR it wrote, 0020 (644b2cc)
  • adr: 0018 the host's one serving process is started by the first asker that finds none (114, 132) (f6e0db4)
  • site: The host's one serving process, its pages and what it keeps, and status on any machine landed (114, 118, 132) (74faa04)
  • openspec: Propose status-on-any-machine (5d8c0ee)
  • openspec: Status-on-any-machine answers every repository at the root, each whole at its own path (132) (b3e1aa0)
  • openspec: Status-on-any-machine keeps a repository's page at ///status, as Bolt 4 names it (4bc0192)
  • site: Status shows every channel and its chain on any machine, the host's record beside them (31, 36, 61) (7f08cb9)
  • adr: 0018 the host's one serving process is started by the first asker that finds none (114, 132) (a1afc4e)
  • site: The host's one serving process, its pages and what it keeps, and status on any machine landed (114, 118, 132) (46ee997)
  • openspec: A host with no bindings file keeps its given ledger on the landing's remote, so two machines read one chain (118 at b64d367) (a7f5364)
  • openspec: The given host key is in the data directory, and several publishers with no gate are refused in words (118, C.10 at 53f6d44) (620f826)
  • openspec: Status-on-any-machine leaves the landing read as last fetched to the-landing-answers-as-last-fetched (77, C.5, C.6) (42a43d1)
  • openspec: Status-on-any-machine declares the laptop's test it changes (19ff3d6)
  • openspec: Archive status-on-any-machine (a7ab636)
  • openspec: The-landing-answers-as-last-fetched reads the landing from the host's copy where its remote does not answer (77, C.5, C.6) (a46db02)
  • site: Every component has beta and stable, an environment's words make channels, and a channel is spelled with its component (125, 131, C.10) (9516930)
  • openspec: The channels' unit ships the givens as a fragment beneath the policy file, alpha and lts one line away, and tailrace policy shows what is in force (C.10) (143df03)
  • adr: 0019 the givens are a fragment beneath the policy file, one line switches one on or overrides it, and tailrace policy shows the table in force (C.10) (1950170)
  • site: The given channels are a fragment beneath the policy file, one line switches alpha or lts on or overrides a given, and tailrace policy shows what is in force (C.10) (23bbe8b)
  • openspec: The channels' unit declares crates/tailrace-core/src/status.rs among its touches (7a7cb94)
  • openspec: The channels' unit declares crates/tailrace/src/commands/status.rs among its touches (92e0177)
  • openspec: The channels' unit holds an environment to C.10's four keys and answers an empty channel as last read with its time (60, C.10) (80e1484)
  • openspec: The channels' unit switches a held given on by its table, has a following channel take prereleases only where its line says so, and names who may ask with approvers (C.10, 32, 95) (f39ab09)
  • openspec: The channels' unit shows the givens held off beneath the table in force with the line that switches each on, through the policy seam's held answer (C.10) (2726684)
  • architecture: Core.14 admits the host the policy file answers as the gate where [signers] names none that may claim acceptance (118, 108, C.10) (cbef8d2)
  • adr: 0021 records the given key in the data directory, the ledger on the landing's remote, and the policy file's given gate and its refusal (118, 108, C.10) (c3ebc49)
  • site: A host needs no bindings file, a laptop whose policy names no gate is its gate, and the made key is listed from its public half (118, 108, C.10) (6d5d8a6)
  • openspec: Declare the gate, its tests and status across machines in the unit's Touches (02ac048)
  • openspec: The-landing-answers-as-last-fetched reads the landing from the host's copy where its remote does not answer (77, C.5, C.6) (631896b)
  • site: The landing is read as last fetched from the host's copy where its remote does not answer (59 to 63, 77) (4624024)
  • openspec: Declare the core and conformance paths the landing's new answer reaches (97315f2)
  • openspec: Archive the-landing-answers-as-last-fetched (8884b77)
  • adr: 0019 records the givens' held mark, approvers on the environment or the channel meant, prereleases, and the held givens carried by the channels answer, as ruled (C.10, 131, 32) (baa0b0f)
  • site: The givens' held mark, the one switch, prereleases and approvers on the self-hosting page (C.10, 32, 95) (0778fc5)
  • openspec: The channels answer carries the givens held off, and approvers are written on the environment, as ruled at 1ae1cc5 and 088430c (131, C.10) (2cc7334)
  • adr: 0019 keeps an on key to the option it rejects, and says the policy seam gains no operation for the held givens (C.10, 131, 136) (783d393)
  • site: The self-hosting page writes approvers on a manual environment and shows the givens held off beneath tailrace policy's table (C.10, 131, 32) (86557b9)
  • An environment's table holds channel, policy, after, target, and approvers where it is manual, and no other key (C.10) (d38413c)
  • openspec: The channels' unit declares the version module it changes (33d203e)
  • openspec: Archive the-channels-answer-says-how-each-moves (adf1751)
  • openspec: Archive a-host-with-no-bindings-file-is-bound-to-the-defaults (6a5db70)
  • openspec: Propose the-publishs-host-tells-the-gate (e41ab07)
  • adr: 0019 the host names what tells its gate, and its publish step tells its own (8fe6501)
  • site: The host's [gate] tells its gate, and beta moves on each publish on the one laptop (130) (6a76db3)
  • openspec: A file naming no [gate] tells the host's own gate (118) (5cf61e8)
  • openspec: Propose the-channels-answer-says-how-each-moves (6293f02)
  • adr: A file naming no [gate] binds the host's publish to tell its own gate (118) (eb76fc2)
  • adr: 0019 a channel is its component and name, and the policy says how it moves (c4439c2)
  • openspec: The publish's host's unit declares the ADR it wrote, 0020 (569f1e0)
  • site: Every component has beta and stable, an environment's words make channels, and a channel is spelled with its component (125, 131, C.10) (30b03a7)
  • openspec: The channels' unit ships the givens as a fragment beneath the policy file, alpha and lts one line away, and tailrace policy shows what is in force (C.10) (28d441e)
  • adr: 0019 the givens are a fragment beneath the policy file, one line switches one on or overrides it, and tailrace policy shows the table in force (C.10) (d4c212a)
  • site: The given channels are a fragment beneath the policy file, one line switches alpha or lts on or overrides a given, and tailrace policy shows what is in force (C.10) (6b95867)
  • openspec: The channels' unit declares crates/tailrace-core/src/status.rs among its touches (0a45051)
  • openspec: The channels' unit declares crates/tailrace/src/commands/status.rs among its touches (73a68f1)
  • openspec: The channels' unit holds an environment to C.10's four keys and answers an empty channel as last read with its time (60, C.10) (551383a)
  • site: The publish's host moves beta on each release, a prerelease only the channels that take prereleases (95, C.10) (9d3bb36)
  • adr: The publish's host's record is 0020, beside the channels' unit's 0019 (d221445)
  • openspec: Archive the-publishs-host-tells-the-gate (b11bddf)