From bc7607b5052dcf10f5c2b5ede38941e1ee1e610d Mon Sep 17 00:00:00 2001 From: "spin-stack-website-sync[bot]" <347572492+spin-stack-website-sync[bot]@users.noreply.github.com> Date: Sat, 24 Oct 2026 23:26:34 +0000 Subject: [PATCH 1/2] sources: spin v20261024.01 b3598142db Written by sync.yml: versions.yaml bumped by task sources:bump, the reference by task reference. --- .../docs/reference/security/known-gaps.md | 2 +- src/content/docs/reference/security/rules.md | 2 +- src/content/docs/reference/status/index.md | 138 +++++++++--------- src/data/figures.json | 8 +- src/data/reference.json | 4 +- versions.yaml | 4 +- 6 files changed, 79 insertions(+), 79 deletions(-) diff --git a/src/content/docs/reference/security/known-gaps.md b/src/content/docs/reference/security/known-gaps.md index f3af1cf..48d98c3 100644 --- a/src/content/docs/reference/security/known-gaps.md +++ b/src/content/docs/reference/security/known-gaps.md @@ -9,7 +9,7 @@ sidebar: -The open items of Spinbox's security model, from spin's [`docs/security/README.md`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/docs/security/README.md) at `77380b13d`. The numbers are [its rules](/reference/security/rules/). +The open items of Spinbox's security model, from spin's [`docs/security/README.md`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/docs/security/README.md) at `b3598142d`. The numbers are [its rules](/reference/security/rules/). What no line keeps yet. Each is a design change, not a patch, which is why it is here. diff --git a/src/content/docs/reference/security/rules.md b/src/content/docs/reference/security/rules.md index a7d573a..2db656f 100644 --- a/src/content/docs/reference/security/rules.md +++ b/src/content/docs/reference/security/rules.md @@ -9,7 +9,7 @@ sidebar: -The rules every entry point must keep, from spin's [`docs/security/README.md`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/docs/security/README.md) at `77380b13d`. Code cites a rule's number at the line that keeps it. **Gate** is what fails a build when the rule is broken; *none* marks a rule kept only by each place remembering it. What is still open is on [Known gaps](/reference/security/known-gaps/). +The rules every entry point must keep, from spin's [`docs/security/README.md`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/docs/security/README.md) at `b3598142d`. Code cites a rule's number at the line that keeps it. **Gate** is what fails a build when the rule is broken; *none* marks a rule kept only by each place remembering it. What is still open is on [Known gaps](/reference/security/known-gaps/). | # | Rule | Gate | |---|---|---| diff --git a/src/content/docs/reference/status/index.md b/src/content/docs/reference/status/index.md index 9e2b162..045a2f6 100644 --- a/src/content/docs/reference/status/index.md +++ b/src/content/docs/reference/status/index.md @@ -9,7 +9,7 @@ sidebar: -Every row of this page is a line of `internal/features` in spin, and a test there resolves it against the tree. A row that says **built** names what shows the feature exists - a procedure the control plane serves, a command the CLI has, or a test - and, under **End to end**, the tests that drive a real runner and its guest and check what the feature did, or what no test checks yet. spin's build checks that each of those tests is there and not quarantined; whether it checks the whole feature is its review's. A row that says **not built** is an item of [`docs/ROADMAP.md`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/docs/ROADMAP.md). The page is written by `task reference` from `spin features` at spin `77380b13d`, and cannot say a feature the binary does not. +Every row of this page is a line of `internal/features` in spin, and a test there resolves it against the tree. A row that says **built** names what shows the feature exists - a procedure the control plane serves, a command the CLI has, or a test - and, under **End to end**, the tests that drive a real runner and its guest and check what the feature did, or what no test checks yet. spin's build checks that each of those tests is there and not quarantined; whether it checks the whole feature is its review's. A row that says **not built** is an item of [`docs/ROADMAP.md`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/docs/ROADMAP.md). The page is written by `task reference` from `spin features` at spin `b3598142d`, and cannot say a feature the binary does not. ## Built @@ -17,116 +17,116 @@ Every row of this page is a line of `internal/features` in spin, and a test ther | Feature | Exists | End to end | |---|---|---| -| A machine per workspace: KVM, its own kernel, root, a persistent disk, SSH | [`TestAWorkspaceBootsARealGuest`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/vm_test.go#L167), a test of `internal/e2e` | [`TestAWorkspaceBootsARealGuest`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/vm_test.go#L167) | -| Create, start, stop and delete | [`WorkspaceService/CreateWorkspace`](/reference/api/workspaceservice/) | [`TestE2E_WorkspaceCRUD`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L397) | -| A trash: a deleted workspace stays whole, for its owner to undelete, until its days are up | [`TestAWorkspaceWhoseDaysInTheTrashAreUpIsErasedFromItsHost`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L379), a test of `internal/e2e` | [`TestATrashedWorkspaceIsWholeWhenItsOwnerUndeletesIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L411)
[`TestAWorkspaceWhoseDaysInTheTrashAreUpIsErasedFromItsHost`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L379) | -| Idle suspend, with a question before it that a keep answers | [`TestAWorkspaceIsAskedBeforeItsSuspensionAndAKeepAnswersIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L107), a test of `internal/e2e` | [`TestAWorkspaceIsAskedBeforeItsSuspensionAndAKeepAnswersIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L107) | -| A workspace that ran as long as the installation allows is suspended | [`TestAWorkspaceThatRanForAsLongAsAllowedIsSuspended`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L69), a test of `internal/e2e` | [`TestAWorkspaceThatRanForAsLongAsAllowedIsSuspended`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L69) | -| A process inside holds its workspace awake while it lives | [`TestAProcessHoldsItsWorkspaceAwakeWhileItLives`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L190), a test of `internal/e2e` | [`TestAProcessHoldsItsWorkspaceAwakeWhileItLives`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L190) | -| Suspend with the processes where they are; a start resumes them | [`TestAWorkspaceNobodyUsesIsSuspendedAndAStartResumesIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L35), a test of `internal/e2e` | [`TestE2E_ASuspendedWorkspaceResumesWhereItWas`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L160)
[`TestAWorkspaceNobodyUsesIsSuspendedAndAStartResumesIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L35) | -| Cores and memory lent while the host has them, and taken back | [`TestABusyWorkspaceIsLentCoresAndGivesThemBack`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L342), a test of `internal/e2e` | not yet: memory lent and taken back, and a loan refused while the host is full | -| A grant of cores and memory of its own, for a while | [`TestAGrantWhoseTimeIsUpIsGivenBackToTheMachine`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L288), a test of `internal/e2e` | [`TestAGrantWhoseTimeIsUpIsGivenBackToTheMachine`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/background_test.go#L288) | -| Move a running workspace to another host, its processes as they are | [`TestHostsAMoveTakesARunningWorkspaceToAnotherHost`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/hosts_flows_test.go#L65), a test of `internal/e2e` | [`TestHostsAMoveTakesARunningWorkspaceToAnotherHost`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/hosts_flows_test.go#L65) | -| Clone a workspace: its disk, team, project, size, policies and environment, in one | [`TestACloneHoldsWhatItsSourceWroteAndItsShape`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/clone_test.go#L68), a test of `internal/e2e` | [`TestACloneHoldsWhatItsSourceWroteAndItsShape`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/clone_test.go#L68) | -| Recover a workspace whose host is gone, at a cost its owner accepts | [`TestHostsAWorkspaceWhoseHostIsGoneIsRecoveredOnAnother`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/hosts_flows_test.go#L99), a test of `internal/e2e` | not yet: the cost asked of the owner before a recovery, and what was written after the snapshot gone | -| A workspace outlives its runner | [`TestAWorkspaceOutlivesItsRunner`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/vm_test.go#L250), a test of `internal/e2e` | [`TestAWorkspaceOutlivesItsRunner`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/vm_test.go#L250) | -| Quarantine, by an administrator | [`WorkspaceService/QuarantineWorkspace`](/reference/api/workspaceservice/) | [`TestE2E_AQuarantinedWorkspaceIsHeldUntilReleased`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L209) | -| Why a workspace is not behaving: status, console, history | [`spin workspace status`](/reference/cli/workspace/) | [`TestE2E_AQuarantinedWorkspaceIsHeldUntilReleased`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L209)
[`TestE2E_AWorkspacesConsoleIsWhatItsMachinePrinted`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L243) | -| The owner's shell, environment, editor settings, Taskfile and dotfiles reach the guest | [`TestAWorkspacesOwnEnvironmentIsInItsOwnersLoginShell`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/env_test.go#L23), a test of `internal/e2e` | [`TestTheOwnersSettingsArriveInTheGuest`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/env_test.go#L64)
[`TestAWorkspacesOwnEnvironmentIsInItsOwnersLoginShell`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/env_test.go#L23) | -| Reset a disk to what it was created from | [`spin workspace reset`](/reference/cli/workspace/) | [`TestE2E_ResetPutsAWorkspaceBackToWhatItWasCreatedFrom`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L1182) | -| Claude Code and Codex on every workspace's PATH, at the versions the release pins, with their own defaults | [`TestTheAgentCLIsAreOnPathWithThePinnedVersions`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/agentclis_test.go#L20), a test of `internal/e2e` | [`TestTheAgentCLIsAreOnPathWithThePinnedVersions`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/agentclis_test.go#L20) | +| A machine per workspace: KVM, its own kernel, root, a persistent disk, SSH | [`TestAWorkspaceBootsARealGuest`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/vm_test.go#L167), a test of `internal/e2e` | [`TestAWorkspaceBootsARealGuest`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/vm_test.go#L167) | +| Create, start, stop and delete | [`WorkspaceService/CreateWorkspace`](/reference/api/workspaceservice/) | [`TestE2E_WorkspaceCRUD`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L397) | +| A trash: a deleted workspace stays whole, for its owner to undelete, until its days are up | [`TestAWorkspaceWhoseDaysInTheTrashAreUpIsErasedFromItsHost`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L379), a test of `internal/e2e` | [`TestATrashedWorkspaceIsWholeWhenItsOwnerUndeletesIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L411)
[`TestAWorkspaceWhoseDaysInTheTrashAreUpIsErasedFromItsHost`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L379) | +| Idle suspend, with a question before it that a keep answers | [`TestAWorkspaceIsAskedBeforeItsSuspensionAndAKeepAnswersIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L107), a test of `internal/e2e` | [`TestAWorkspaceIsAskedBeforeItsSuspensionAndAKeepAnswersIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L107) | +| A workspace that ran as long as the installation allows is suspended | [`TestAWorkspaceThatRanForAsLongAsAllowedIsSuspended`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L69), a test of `internal/e2e` | [`TestAWorkspaceThatRanForAsLongAsAllowedIsSuspended`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L69) | +| A process inside holds its workspace awake while it lives | [`TestAProcessHoldsItsWorkspaceAwakeWhileItLives`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L190), a test of `internal/e2e` | [`TestAProcessHoldsItsWorkspaceAwakeWhileItLives`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L190) | +| Suspend with the processes where they are; a start resumes them | [`TestAWorkspaceNobodyUsesIsSuspendedAndAStartResumesIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L35), a test of `internal/e2e` | [`TestE2E_ASuspendedWorkspaceResumesWhereItWas`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L160)
[`TestAWorkspaceNobodyUsesIsSuspendedAndAStartResumesIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L35) | +| Cores and memory lent while the host has them, and taken back | [`TestABusyWorkspaceIsLentCoresAndGivesThemBack`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L342), a test of `internal/e2e` | not yet: memory lent and taken back, and a loan refused while the host is full | +| A grant of cores and memory of its own, for a while | [`TestAGrantWhoseTimeIsUpIsGivenBackToTheMachine`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L288), a test of `internal/e2e` | [`TestAGrantWhoseTimeIsUpIsGivenBackToTheMachine`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/background_test.go#L288) | +| Move a running workspace to another host, its processes as they are | [`TestHostsAMoveTakesARunningWorkspaceToAnotherHost`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/hosts_flows_test.go#L65), a test of `internal/e2e` | [`TestHostsAMoveTakesARunningWorkspaceToAnotherHost`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/hosts_flows_test.go#L65) | +| Clone a workspace: its disk, team, project, size, policies and environment, in one | [`TestACloneHoldsWhatItsSourceWroteAndItsShape`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/clone_test.go#L68), a test of `internal/e2e` | [`TestACloneHoldsWhatItsSourceWroteAndItsShape`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/clone_test.go#L68) | +| Recover a workspace whose host is gone, at a cost its owner accepts | [`TestHostsAWorkspaceWhoseHostIsGoneIsRecoveredOnAnother`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/hosts_flows_test.go#L99), a test of `internal/e2e` | not yet: the cost asked of the owner before a recovery, and what was written after the snapshot gone | +| A workspace outlives its runner | [`TestAWorkspaceOutlivesItsRunner`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/vm_test.go#L250), a test of `internal/e2e` | [`TestAWorkspaceOutlivesItsRunner`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/vm_test.go#L250) | +| Quarantine, by an administrator | [`WorkspaceService/QuarantineWorkspace`](/reference/api/workspaceservice/) | [`TestE2E_AQuarantinedWorkspaceIsHeldUntilReleased`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L209) | +| Why a workspace is not behaving: status, console, history | [`spin workspace status`](/reference/cli/workspace/) | [`TestE2E_AQuarantinedWorkspaceIsHeldUntilReleased`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L209)
[`TestE2E_AWorkspacesConsoleIsWhatItsMachinePrinted`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L243) | +| The owner's shell, environment, editor settings, Taskfile and dotfiles reach the guest | [`TestAWorkspacesOwnEnvironmentIsInItsOwnersLoginShell`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/env_test.go#L23), a test of `internal/e2e` | [`TestTheOwnersSettingsArriveInTheGuest`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/env_test.go#L64)
[`TestAWorkspacesOwnEnvironmentIsInItsOwnersLoginShell`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/env_test.go#L23) | +| Reset a disk to what it was created from | [`spin workspace reset`](/reference/cli/workspace/) | [`TestE2E_ResetPutsAWorkspaceBackToWhatItWasCreatedFrom`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L1182) | +| Claude Code and Codex on every workspace's PATH, at the versions the release pins, with their own defaults | [`TestTheAgentCLIsAreOnPathWithThePinnedVersions`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/agentclis_test.go#L20), a test of `internal/e2e` | [`TestTheAgentCLIsAreOnPathWithThePinnedVersions`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/agentclis_test.go#L20) | ### Teams and projects | Feature | Exists | End to end | |---|---|---| -| Open a repository, branch, commit or pull request from its URL, in the dashboard (/launch) and from the terminal
*From the terminal; the dashboard's /launch page makes the same create and has no test of its own against the stack.* | [`spin open --no-connect`](/reference/cli/open/) | [`TestE2E_AURLOpensTheWorkspaceItNames`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L97) | -| A workspace opened at a commit or a pull request, checked out as pr-<n> | [`TestAProjectsWorkspaceOpensAtTheCommitItWasAskedFor`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/project_test.go#L91), a test of `internal/e2e` | [`TestAProjectsWorkspaceOpensAtTheCommitItWasAskedFor`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/project_test.go#L91)
[`TestE2E_AURLOpensTheWorkspaceItNames`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L97) | -| Teams, with owner, admin and member | [`spin team member role`](/reference/cli/team/) | [`TestE2E_ATeamRoleIsWhatItsHolderMayDo`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L473) | -| A team's own identity providers | [`TeamService/CreateIdentityProvider`](/reference/api/teamservice/) | [`TestE2E_ATeamsIdentityProviderIsItsAdminsAndSignsNobodyIn`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L505) | +| Open a repository, branch, commit or pull request from its URL, in the dashboard (/launch) and from the terminal
*From the terminal; the dashboard's /launch page makes the same create and has no test of its own against the stack.* | [`spin open --no-connect`](/reference/cli/open/) | [`TestE2E_AURLOpensTheWorkspaceItNames`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L97) | +| A workspace opened at a commit or a pull request, checked out as pr-<n> | [`TestAProjectsWorkspaceOpensAtTheCommitItWasAskedFor`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/project_test.go#L91), a test of `internal/e2e` | [`TestAProjectsWorkspaceOpensAtTheCommitItWasAskedFor`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/project_test.go#L91)
[`TestE2E_AURLOpensTheWorkspaceItNames`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L97) | +| Teams, with owner, admin and member | [`spin team member role`](/reference/cli/team/) | [`TestE2E_ATeamRoleIsWhatItsHolderMayDo`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L473) | +| A team's own identity providers | [`TeamService/CreateIdentityProvider`](/reference/api/teamservice/) | [`TestE2E_ATeamsIdentityProviderIsItsAdminsAndSignsNobodyIn`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L505) | | A team's forge app: private repositories cloned and pushed with nothing on the disk | [`spin team forge set`](/reference/cli/team/) | not yet: a real GitHub App and a private repository for the lane to clone and push | -| A team's own network policies, where the installation allows them | [`spin team policy set`](/reference/cli/team/) | [`TestATeamsOwnPolicyIsWhatItsWorkspacesReach`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/team_policy_test.go#L24) | -| Projects: a repository and the shape of the workspace that opens it | [`TestAProjectsWorkspaceHasItsRepositoryCheckedOutAtTheRef`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/project_test.go#L27), a test of `internal/e2e` | [`TestAProjectsWorkspaceHasItsRepositoryCheckedOutAtTheRef`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/project_test.go#L27) | -| Prebuilds of a project's refs, as the floor of the workspaces that open them | [`TestAProjectOpensAsItsPrebuildMadeIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/prebuild_test.go#L29), a test of `internal/e2e` | [`TestAProjectOpensAsItsPrebuildMadeIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/prebuild_test.go#L29) | -| A team's workspaces run on the installation's hosts | [`TestATeamsWorkspaceRunsOnTheInstallationsHost`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/team_test.go#L20), a test of `internal/e2e` | [`TestATeamsWorkspaceRunsOnTheInstallationsHost`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/team_test.go#L20) | +| A team's own network policies, where the installation allows them | [`spin team policy set`](/reference/cli/team/) | [`TestATeamsOwnPolicyIsWhatItsWorkspacesReach`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/team_policy_test.go#L24) | +| Projects: a repository and the shape of the workspace that opens it | [`TestAProjectsWorkspaceHasItsRepositoryCheckedOutAtTheRef`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/project_test.go#L27), a test of `internal/e2e` | [`TestAProjectsWorkspaceHasItsRepositoryCheckedOutAtTheRef`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/project_test.go#L27) | +| Prebuilds of a project's refs, as the floor of the workspaces that open them | [`TestAProjectOpensAsItsPrebuildMadeIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/prebuild_test.go#L29), a test of `internal/e2e` | [`TestAProjectOpensAsItsPrebuildMadeIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/prebuild_test.go#L29) | +| A team's workspaces run on the installation's hosts | [`TestATeamsWorkspaceRunsOnTheInstallationsHost`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/team_test.go#L20), a test of `internal/e2e` | [`TestATeamsWorkspaceRunsOnTheInstallationsHost`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/team_test.go#L20) | ### Snapshots | Feature | Exists | End to end | |---|---|---| -| Snapshots of a running workspace's disk | [`WorkspaceService/CreateSnapshot`](/reference/api/workspaceservice/) | [`TestACloneHoldsWhatItsSourceWroteAndItsShape`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/clone_test.go#L68)
[`TestADiskSnapshottedPastTheThresholdIsCompactedWhileItRuns`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/compaction_test.go#L19) | -| Snapshots with memory, resumed with their processes | [`TestARunningWorkspaceResumesFromASnapshotsMemory`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/restore_test.go#L175), a test of `internal/e2e` | [`TestARunningWorkspaceResumesFromASnapshotsMemory`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/restore_test.go#L175) | -| Restore a workspace to a snapshot | [`TestARestoredWorkspaceBootsOnTheSnapshotItWasRestoredTo`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/restore_test.go#L29), a test of `internal/e2e` | [`TestARestoredWorkspaceBootsOnTheSnapshotItWasRestoredTo`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/restore_test.go#L29) | -| A diff of the files that changed between two snapshots | [`TestADiffOfTwoSnapshotsIsWhatChangedBetweenThem`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/diff_test.go#L28), a test of `internal/e2e` | [`TestADiffOfTwoSnapshotsNamesWhatWasAddedChangedAndRemoved`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/diff_test.go#L95) | -| Share a snapshot with a person or make it public, and create a workspace from it | [`TestACloneOfASnapshotRegistersAsItself`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/clone_test.go#L24), a test of `internal/e2e` | [`TestASharedSnapshotIsCreatedFromByThePersonItIsSharedWith`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/share_test.go#L22) | -| What looks like a credential is found before a share, and the share refused unless acknowledged | [`ShareService/ShareSnapshot`](/reference/api/shareservice/) | [`TestE2E_ASharedSnapshotIsScannedForCredentials`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L46) | -| A long chain is compacted while the workspace runs | [`TestADiskSnapshottedPastTheThresholdIsCompactedWhileItRuns`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/compaction_test.go#L19), a test of `internal/e2e` | [`TestADiskSnapshottedPastTheThresholdIsCompactedWhileItRuns`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/compaction_test.go#L19) | +| Snapshots of a running workspace's disk | [`WorkspaceService/CreateSnapshot`](/reference/api/workspaceservice/) | [`TestACloneHoldsWhatItsSourceWroteAndItsShape`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/clone_test.go#L68)
[`TestADiskSnapshottedPastTheThresholdIsCompactedWhileItRuns`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/compaction_test.go#L19) | +| Snapshots with memory, resumed with their processes | [`TestARunningWorkspaceResumesFromASnapshotsMemory`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/restore_test.go#L175), a test of `internal/e2e` | [`TestARunningWorkspaceResumesFromASnapshotsMemory`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/restore_test.go#L175) | +| Restore a workspace to a snapshot | [`TestARestoredWorkspaceBootsOnTheSnapshotItWasRestoredTo`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/restore_test.go#L29), a test of `internal/e2e` | [`TestARestoredWorkspaceBootsOnTheSnapshotItWasRestoredTo`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/restore_test.go#L29) | +| A diff of the files that changed between two snapshots | [`TestADiffOfTwoSnapshotsIsWhatChangedBetweenThem`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/diff_test.go#L28), a test of `internal/e2e` | [`TestADiffOfTwoSnapshotsNamesWhatWasAddedChangedAndRemoved`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/diff_test.go#L95) | +| Share a snapshot with a person or make it public, and create a workspace from it | [`TestACloneOfASnapshotRegistersAsItself`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/clone_test.go#L24), a test of `internal/e2e` | [`TestASharedSnapshotIsCreatedFromByThePersonItIsSharedWith`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/share_test.go#L22) | +| What looks like a credential is found before a share, and the share refused unless acknowledged | [`ShareService/ShareSnapshot`](/reference/api/shareservice/) | [`TestE2E_ASharedSnapshotIsScannedForCredentials`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L46) | +| A long chain is compacted while the workspace runs | [`TestADiskSnapshottedPastTheThresholdIsCompactedWhileItRuns`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/compaction_test.go#L19), a test of `internal/e2e` | [`TestADiskSnapshottedPastTheThresholdIsCompactedWhileItRuns`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/compaction_test.go#L19) | ### Network | Feature | Exists | End to end | |---|---|---| -| Egress is closed by default; policies, by tag, name what a workspace may reach | [`TestAnOwnerMayOnlyChooseAPolicyTheInstallationDeclares`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/retag_test.go#L163), a test of `internal/e2e` | [`TestAWorkspaceNamedNoPolicyReachesNothing`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/retag_test.go#L71)
[`TestChangingAWorkspacesPoliciesReachesTheHostThatRunsIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/retag_test.go#L24) | -| A policy changed reaches the host that runs the workspace | [`TestChangingAWorkspacesPoliciesReachesTheHostThatRunsIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/retag_test.go#L24), a test of `internal/e2e` | [`TestAnEditedPolicyChangesWhatARunningGuestReaches`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/retag_test.go#L100)
[`TestChangingAWorkspacesPoliciesReachesTheHostThatRunsIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/retag_test.go#L24) | +| Egress is closed by default; policies, by tag, name what a workspace may reach | [`TestAnOwnerMayOnlyChooseAPolicyTheInstallationDeclares`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/retag_test.go#L163), a test of `internal/e2e` | [`TestAWorkspaceNamedNoPolicyReachesNothing`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/retag_test.go#L71)
[`TestChangingAWorkspacesPoliciesReachesTheHostThatRunsIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/retag_test.go#L24) | +| A policy changed reaches the host that runs the workspace | [`TestChangingAWorkspacesPoliciesReachesTheHostThatRunsIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/retag_test.go#L24), a test of `internal/e2e` | [`TestAnEditedPolicyChangesWhatARunningGuestReaches`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/retag_test.go#L100)
[`TestChangingAWorkspacesPoliciesReachesTheHostThatRunsIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/retag_test.go#L24) | | Brokered names: the host's proxy stands in and adds what the workspace never holds - a team secret, a forge token, its identity, a cloud role | [`spin team secret set`](/reference/cli/team/) | not yet: the forge, identity and cloud role injections, and the secret's value seen at the origin | -| A workspace trusts the egress root only by its owner's word | [`TestAGuestTrustsTheEgressRootOnlyByItsOwnersWord`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/egress_root_test.go#L20), a test of `internal/e2e` | [`TestAGuestTrustsTheEgressRootOnlyByItsOwnersWord`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/egress_root_test.go#L20) | -| What a workspace reached, what it looked up and what it was refused | [`spin workspace egress`](/reference/cli/workspace/) | [`TestE2E_EgressIsAnsweredByTheHostTheWorkspaceRunsOn`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L766) | -| Each request to a brokered name as the proxy read it, served or refused and why; and whether each injection's secret is the team's to give | [`TestABrokeredRequestIsSeenAsTheProxyReadIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L28), a test of `internal/e2e` | [`TestABrokeredRequestIsSeenAsTheProxyReadIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L28) | -| The egress proxy is a process of its own, holding no key of the host's, started again by the runner when it ends | [`TestTheEgressProxyIsAProcessOfItsOwnThatTheRunnerStartsAgain`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/egress_process_test.go#L21), a test of `internal/e2e` | [`TestTheEgressProxyIsAProcessOfItsOwnThatTheRunnerStartsAgain`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/egress_process_test.go#L21) | -| A brokered rule names whose it is, the agent's or the person's: one policy says what each may reach and with what | [`TestABrokeredNameForTheAgentIsTheAgentsAlone`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L72), a test of `internal/e2e` | [`TestAPersonsRuleAndAnAgentsOnOneNameEachArriveWithTheirOwnInjection`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L100)
[`TestABrokeredNameForTheAgentIsTheAgentsAlone`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L72) | -| A WebSocket to a brokered name: its handshake under the rule's headers and scope, then bytes each way
*The rule's header on the handshake is not read at the origin: the lane's WebSocket echo answers frames, not headers.* | [`TestAWebSocketToABrokeredNameIsCarriedAfterItsHandshake`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L168), a test of `internal/e2e` | [`TestAWebSocketToABrokeredNameCarriesTheGuestsBytesAndRefusesAPathOutOfScope`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L196)
[`TestAWebSocketToABrokeredNameIsCarriedAfterItsHandshake`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L168) | -| HTTP/2 to a brokered name, the proxy's ALPN the real host's: a rule's headers set stream by stream, gRPC's trailers both ways | [`TestHTTP2ToABrokeredNameIsTheRealHosts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L231), a test of `internal/e2e` | not yet: headers on several streams and gRPC's trailers, which need an h2 origin that echoes them | -| Watch where a workspace connects, into its logs | [`spin workspace watch`](/reference/cli/workspace/) | [`TestE2E_AWatchedWorkspacesConnectionsAreInItsLogs`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L264) | -| An agent the supervisor starts is marked, and reaches only brokered names | [`TestARealWorkspaceMarksTheAgentItsSupervisorStarts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/seal_test.go#L21), a test of `internal/e2e` | [`TestAnAgentReachesOnlyBrokeredNames`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/brokered_test.go#L138)
[`TestARealWorkspaceMarksTheAgentItsSupervisorStarts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/seal_test.go#L21) | -| Published ports at https://{port}-{workspace}.{domain}: private, whitelisted or public | [`spin port expose`](/reference/cli/port/) | [`TestAPublicPortIsReachedWithNoSessionAtAll`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/proxy/lane_test.go#L144)
[`workspace-sign-in.spec.ts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/dashboard/e2e/workspace-sign-in.spec.ts#L31): a visitor signed in to the dashboard reaches their private port | +| A workspace trusts the egress root only by its owner's word | [`TestAGuestTrustsTheEgressRootOnlyByItsOwnersWord`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/egress_root_test.go#L20), a test of `internal/e2e` | [`TestAGuestTrustsTheEgressRootOnlyByItsOwnersWord`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/egress_root_test.go#L20) | +| What a workspace reached, what it looked up and what it was refused | [`spin workspace egress`](/reference/cli/workspace/) | [`TestE2E_EgressIsAnsweredByTheHostTheWorkspaceRunsOn`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L766) | +| Each request to a brokered name as the proxy read it, served or refused and why; and whether each injection's secret is the team's to give | [`TestABrokeredRequestIsSeenAsTheProxyReadIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L28), a test of `internal/e2e` | [`TestABrokeredRequestIsSeenAsTheProxyReadIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L28) | +| The egress proxy is a process of its own, holding no key of the host's, started again by the runner when it ends | [`TestTheEgressProxyIsAProcessOfItsOwnThatTheRunnerStartsAgain`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/egress_process_test.go#L21), a test of `internal/e2e` | [`TestTheEgressProxyIsAProcessOfItsOwnThatTheRunnerStartsAgain`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/egress_process_test.go#L21) | +| A brokered rule names whose it is, the agent's or the person's: one policy says what each may reach and with what | [`TestABrokeredNameForTheAgentIsTheAgentsAlone`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L72), a test of `internal/e2e` | [`TestAPersonsRuleAndAnAgentsOnOneNameEachArriveWithTheirOwnInjection`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L100)
[`TestABrokeredNameForTheAgentIsTheAgentsAlone`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L72) | +| A WebSocket to a brokered name: its handshake under the rule's headers and scope, then bytes each way
*The rule's header on the handshake is not read at the origin: the lane's WebSocket echo answers frames, not headers.* | [`TestAWebSocketToABrokeredNameIsCarriedAfterItsHandshake`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L168), a test of `internal/e2e` | [`TestAWebSocketToABrokeredNameCarriesTheGuestsBytesAndRefusesAPathOutOfScope`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L196)
[`TestAWebSocketToABrokeredNameIsCarriedAfterItsHandshake`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L168) | +| HTTP/2 to a brokered name, the proxy's ALPN the real host's: a rule's headers set stream by stream, gRPC's trailers both ways | [`TestHTTP2ToABrokeredNameIsTheRealHosts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L231), a test of `internal/e2e` | not yet: headers on several streams and gRPC's trailers, which need an h2 origin that echoes them | +| Watch where a workspace connects, into its logs | [`spin workspace watch`](/reference/cli/workspace/) | [`TestE2E_AWatchedWorkspacesConnectionsAreInItsLogs`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L264) | +| An agent the supervisor starts is marked, and reaches only brokered names | [`TestARealWorkspaceMarksTheAgentItsSupervisorStarts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/seal_test.go#L21), a test of `internal/e2e` | [`TestAnAgentReachesOnlyBrokeredNames`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/brokered_test.go#L138)
[`TestARealWorkspaceMarksTheAgentItsSupervisorStarts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/seal_test.go#L21) | +| Published ports at https://{port}-{workspace}.{domain}: private, whitelisted or public | [`spin port expose`](/reference/cli/port/) | [`TestAPublicPortIsReachedWithNoSessionAtAll`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/proxy/lane_test.go#L144)
[`workspace-sign-in.spec.ts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/dashboard/e2e/workspace-sign-in.spec.ts#L31): a visitor signed in to the dashboard reaches their private port | ### Access | Feature | Exists | End to end | |---|---|---| | Sign in with GitHub or an OIDC provider | [`AuthService/StartLogin`](/reference/api/authservice/) | not yet: a GitHub provider: the sign-in through it and the verified email it gives | -| Device login for a terminal | [`AuthService/StartDeviceLogin`](/reference/api/authservice/) | [`TestE2E_Logout`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L1169)
[`auth.spec.ts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/dashboard/e2e/auth.spec.ts#L19): the CLI's device page stands alone and keeps its code through a sign-in | -| API keys for scripts and agents | [`spin api-key create`](/reference/cli/api-key/) | [`TestE2E_APIKeyCRUD`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L1124) | -| SSH keys, and plain ssh to spin.<workspace> | [`spin ssh-config`](/reference/cli/ssh-config/) | [`TestE2E_SSHConfigCarriesSSHToAWorkspace`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L637) | -| Who logs in to a workspace is what its owner signed | [`TestOnlyThePeopleTheAccessNamesLogInToAWorkspace`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/login_test.go#L259), a test of `internal/e2e` | [`TestOnlyThePeopleTheAccessNamesLogInToAWorkspace`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/login_test.go#L259) | -| Guests of a workspace, invited by its owner | [`spin workspace guests`](/reference/cli/workspace/) | [`TestOnlyThePeopleTheAccessNamesLogInToAWorkspace`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/login_test.go#L259) | -| A workspace's identity, signed by its host, for the audiences its owner allows | [`TestAWorkspacesIdentityIsTheHostsSignatureOfWhatItsOwnerSigned`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/identity_test.go#L60), a test of `internal/e2e` | [`TestAWorkspacesIdentityIsTheHostsSignatureOfWhatItsOwnerSigned`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/identity_test.go#L60) | -| VS Code over SSH, with the server the installation publishes and nothing downloaded
*spin code itself is run by its unit tests only: it opens VS Code desktop, which no lane has.* | [`TestAVSCodeServerOfAnotherCommitIsHandedToTheRunningMachine`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/vscodehotplug_test.go#L23), a test of `internal/e2e` | [`TestTheCarriedVSCodeServerRunsOfflineAndAnswersOverTheSSHTunnel`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/vscodeserver_test.go#L86)
[`TestAVSCodeServerOfAnotherCommitIsHandedToTheRunningMachine`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/vscodehotplug_test.go#L23) | -| Run a command in a workspace, copy files to and from it | [`spin exec`](/reference/cli/exec/) | [`TestE2E_ADetachedRunIsFollowedToItsEndAndFilesGoBothWays`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L178) | +| Device login for a terminal | [`AuthService/StartDeviceLogin`](/reference/api/authservice/) | [`TestE2E_Logout`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L1169)
[`auth.spec.ts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/dashboard/e2e/auth.spec.ts#L19): the CLI's device page stands alone and keeps its code through a sign-in | +| API keys for scripts and agents | [`spin api-key create`](/reference/cli/api-key/) | [`TestE2E_APIKeyCRUD`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L1124) | +| SSH keys, and plain ssh to spin.<workspace> | [`spin ssh-config`](/reference/cli/ssh-config/) | [`TestE2E_SSHConfigCarriesSSHToAWorkspace`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L637) | +| Who logs in to a workspace is what its owner signed | [`TestOnlyThePeopleTheAccessNamesLogInToAWorkspace`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/login_test.go#L259), a test of `internal/e2e` | [`TestOnlyThePeopleTheAccessNamesLogInToAWorkspace`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/login_test.go#L259) | +| Guests of a workspace, invited by its owner | [`spin workspace guests`](/reference/cli/workspace/) | [`TestOnlyThePeopleTheAccessNamesLogInToAWorkspace`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/login_test.go#L259) | +| A workspace's identity, signed by its host, for the audiences its owner allows | [`TestAWorkspacesIdentityIsTheHostsSignatureOfWhatItsOwnerSigned`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/identity_test.go#L60), a test of `internal/e2e` | [`TestAWorkspacesIdentityIsTheHostsSignatureOfWhatItsOwnerSigned`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/identity_test.go#L60) | +| VS Code over SSH, with the server the installation publishes and nothing downloaded
*spin code itself is run by its unit tests only: it opens VS Code desktop, which no lane has.* | [`TestAVSCodeServerOfAnotherCommitIsHandedToTheRunningMachine`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/vscodehotplug_test.go#L23), a test of `internal/e2e` | [`TestTheCarriedVSCodeServerRunsOfflineAndAnswersOverTheSSHTunnel`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/vscodeserver_test.go#L86)
[`TestAVSCodeServerOfAnotherCommitIsHandedToTheRunningMachine`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/vscodehotplug_test.go#L23) | +| Run a command in a workspace, copy files to and from it | [`spin exec`](/reference/cli/exec/) | [`TestE2E_ADetachedRunIsFollowedToItsEndAndFilesGoBothWays`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L178) | ### Administration | Feature | Exists | End to end | |---|---|---| | Installation settings seeded from a file; a change in the file is a proposal to apply or dismiss | [`AdminService/DecideConfigChange`](/reference/api/adminservice/) | not yet: the real file read, an apply and its effect, and a dismiss kept when the file is read again | -| Resource presets | [`AdminService/CreateResourcePreset`](/reference/api/adminservice/) | [`admin.spec.ts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/dashboard/e2e/admin.spec.ts#L422): an admin's preset sizes a person's workspace, and is gone once deleted | -| Registration: open, by allowlist, or closed | [`AdminService/SetRegistrationMode`](/reference/api/adminservice/) | [`admin.spec.ts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/dashboard/e2e/admin.spec.ts#L216): closed, open and a domain on the allowlist decide who registers
[`admin.spec.ts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/dashboard/e2e/admin.spec.ts#L146): the allowlist lets in who it names, and nobody else | -| An audit log | [`AdminService/ListAuditLog`](/reference/api/adminservice/) | [`TestE2E_AnAdministratorsActionIsAuditedWithItsActorAndTarget`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L580)
[`admin.spec.ts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/dashboard/e2e/admin.spec.ts#L895): admin reads the log and can narrow it to one kind of event | -| The control plane's jobs, and running one now | [`spin admin jobs`](/reference/cli/admin/) | [`TestACarryResumesASuspendedWorkspaceAndStopsIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/carry_test.go#L21)
[`admin.spec.ts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/dashboard/e2e/admin.spec.ts#L705): admin runs a job by hand and sees how it ended | +| Resource presets | [`AdminService/CreateResourcePreset`](/reference/api/adminservice/) | [`admin.spec.ts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/dashboard/e2e/admin.spec.ts#L422): an admin's preset sizes a person's workspace, and is gone once deleted | +| Registration: open, by allowlist, or closed | [`AdminService/SetRegistrationMode`](/reference/api/adminservice/) | [`admin.spec.ts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/dashboard/e2e/admin.spec.ts#L216): closed, open and a domain on the allowlist decide who registers
[`admin.spec.ts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/dashboard/e2e/admin.spec.ts#L146): the allowlist lets in who it names, and nobody else | +| An audit log | [`AdminService/ListAuditLog`](/reference/api/adminservice/) | [`TestE2E_AnAdministratorsActionIsAuditedWithItsActorAndTarget`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L580)
[`admin.spec.ts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/dashboard/e2e/admin.spec.ts#L895): admin reads the log and can narrow it to one kind of event | +| The control plane's jobs, and running one now | [`spin admin jobs`](/reference/cli/admin/) | [`TestACarryResumesASuspendedWorkspaceAndStopsIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/carry_test.go#L21)
[`admin.spec.ts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/dashboard/e2e/admin.spec.ts#L705): admin runs a job by hand and sees how it ended | | The month's bill, its forecast, and what each workspace cost | [`spin admin costs`](/reference/cli/admin/) | not yet: the cloud's real bill read: no lane has an AWS account, so the bill a test gives the reader stands in for it | -| The store: every volume, whose it is, and taking out what nothing needs | [`spin admin storage list`](/reference/cli/admin/) | [`TestAVolumeNothingNeedsIsTakenOutOfTheStore`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/orphan_test.go#L26) | -| Re-key a workspace's disk | [`spin admin volume rekey`](/reference/cli/admin/) | [`TestARekeyedDiskBootsWithWhatItHeldUnderANewKey`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/rekey_test.go#L24) | +| The store: every volume, whose it is, and taking out what nothing needs | [`spin admin storage list`](/reference/cli/admin/) | [`TestAVolumeNothingNeedsIsTakenOutOfTheStore`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/orphan_test.go#L26) | +| Re-key a workspace's disk | [`spin admin volume rekey`](/reference/cli/admin/) | [`TestARekeyedDiskBootsWithWhatItHeldUnderANewKey`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/rekey_test.go#L24) | | Runners: registration tokens, drain, activate, revoke, and a policy per host | [`spin admin runner drain`](/reference/cli/admin/) | not yet: a runner registered with a token the API made, an expired or revoked token refused, and a revoke carried out | | Runners start when a workspace waits for one and stop when nothing runs | [`HostService/GetFleet`](/reference/api/hostservice/) | not yet: an autoscaling group to start and stop: the one group is AWS's, and no lane has an account | -| A host that reboots brings its workspaces back | [`TestAHostRebootBringsItsWorkspacesBack`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/restart_test.go#L38), a test of `internal/e2e` | [`TestAHostRebootBringsItsWorkspacesBack`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/restart_test.go#L38) | -| A cloud's reclaim warning empties the host before the machine goes | [`TestACloudsReclaimWarningEmptiesTheHostBeforeAnySignal`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/preemption_test.go#L26), a test of `internal/e2e` | [`TestACloudsReclaimWarningEmptiesTheHostBeforeAnySignal`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/preemption_test.go#L26) | -| A writeback bound per host, measured on that host before it is taken | [`TestCustomWritebackValuesAreMeasuredOnTheRunner`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/writeback_test.go#L28), a test of `internal/e2e` | [`TestCustomWritebackValuesAreMeasuredOnTheRunner`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/writeback_test.go#L28) | -| What is running where: the control plane, each runner and its machine | [`spin admin versions`](/reference/cli/admin/) | [`TestE2E_Admin`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L1026) | +| A host that reboots brings its workspaces back | [`TestAHostRebootBringsItsWorkspacesBack`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/restart_test.go#L38), a test of `internal/e2e` | [`TestAHostRebootBringsItsWorkspacesBack`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/restart_test.go#L38) | +| A cloud's reclaim warning empties the host before the machine goes | [`TestACloudsReclaimWarningEmptiesTheHostBeforeAnySignal`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/preemption_test.go#L26), a test of `internal/e2e` | [`TestACloudsReclaimWarningEmptiesTheHostBeforeAnySignal`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/preemption_test.go#L26) | +| A writeback bound per host, measured on that host before it is taken | [`TestCustomWritebackValuesAreMeasuredOnTheRunner`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/writeback_test.go#L28), a test of `internal/e2e` | [`TestCustomWritebackValuesAreMeasuredOnTheRunner`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/writeback_test.go#L28) | +| What is running where: the control plane, each runner and its machine | [`spin admin versions`](/reference/cli/admin/) | [`TestE2E_Admin`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L1026) | ### Observability | Feature | Exists | End to end | |---|---|---| -| Platform logs, workspace logs and traces, searched in the product | [`LogService/SearchPlatformLogs`](/reference/api/logservice/) | [`TestAWorkspacesLinesAndTracesAreFoundBySearchingForIt`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/observe_test.go#L22)
[`TestE2E_TheInstallationsLogsAreSearchable`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L928) | -| Metrics, with Grafana on the control plane | [`AdminService/GetMonitoring`](/reference/api/adminservice/) | [`admin.spec.ts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/dashboard/e2e/admin.spec.ts#L1149): a series of the lane's host is in the metric store, read through Grafana
[`admin.spec.ts`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/dashboard/e2e/admin.spec.ts#L1126): admin reads the installation's dashboards without leaving the page | -| A workspace's journal and console are collected only with its owner's consent | [`spin workspace logs-consent`](/reference/cli/workspace/) | [`TestE2E_AWorkspacesConsoleIsKeptAndSearchable`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/e2e_test.go#L949) | +| Platform logs, workspace logs and traces, searched in the product | [`LogService/SearchPlatformLogs`](/reference/api/logservice/) | [`TestAWorkspacesLinesAndTracesAreFoundBySearchingForIt`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/observe_test.go#L22)
[`TestE2E_TheInstallationsLogsAreSearchable`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L928) | +| Metrics, with Grafana on the control plane | [`AdminService/GetMonitoring`](/reference/api/adminservice/) | [`admin.spec.ts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/dashboard/e2e/admin.spec.ts#L1149): a series of the lane's host is in the metric store, read through Grafana
[`admin.spec.ts`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/dashboard/e2e/admin.spec.ts#L1126): admin reads the installation's dashboards without leaving the page | +| A workspace's journal and console are collected only with its owner's consent | [`spin workspace logs-consent`](/reference/cli/workspace/) | [`TestE2E_AWorkspacesConsoleIsKeptAndSearchable`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/e2e_test.go#L949) | ### Platform | Feature | Exists | End to end | |---|---|---| -| A smoke test of what an installation's API promises, with a workspace of its own | [`spin smoke`](/reference/cli/smoke/) | [`TestE2E_SmokePassesAndLeavesNothingBehind`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/cmd/cli/journeys_e2e_test.go#L314) | -| A host serves only the releases it carries
*A resume whose recorded release was collected since has no test against the stack.* | [`TestAMachineAdoptedWithoutItsReleasesIsSuspendedWithItsDisk`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/suspend_test.go#L126), a test of `internal/e2e` | [`TestAMachineAdoptedWithoutItsReleasesIsSuspendedWithItsDisk`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/suspend_test.go#L126)
[`TestAVSCodeServerOfAnotherCommitIsHandedToTheRunningMachine`](https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/internal/e2e/vscodehotplug_test.go#L23) | +| A smoke test of what an installation's API promises, with a workspace of its own | [`spin smoke`](/reference/cli/smoke/) | [`TestE2E_SmokePassesAndLeavesNothingBehind`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/cmd/cli/journeys_e2e_test.go#L314) | +| A host serves only the releases it carries
*A resume whose recorded release was collected since has no test against the stack.* | [`TestAMachineAdoptedWithoutItsReleasesIsSuspendedWithItsDisk`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/suspend_test.go#L126), a test of `internal/e2e` | [`TestAMachineAdoptedWithoutItsReleasesIsSuspendedWithItsDisk`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/suspend_test.go#L126)
[`TestAVSCodeServerOfAnotherCommitIsHandedToTheRunningMachine`](https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/internal/e2e/vscodehotplug_test.go#L23) | ## Partly there diff --git a/src/data/figures.json b/src/data/figures.json index c7df7f3..df1cec1 100644 --- a/src/data/figures.json +++ b/src/data/figures.json @@ -1,6 +1,6 @@ { "datapath": { - "source": "https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/docs/network/datapath", + "source": "https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/docs/network/datapath", "width": 552, "words": [ "How a packet leaves a workspace", @@ -56,7 +56,7 @@ ] }, "egress-policy": { - "source": "https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/docs/network/egress-policy", + "source": "https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/docs/network/egress-policy", "width": 854, "words": [ "What the forward chain decides, in order", @@ -157,7 +157,7 @@ ] }, "isolation": { - "source": "https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/docs/network/isolation", + "source": "https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/docs/network/isolation", "width": 499, "words": [ "Same address, different segment", @@ -204,7 +204,7 @@ ] }, "traffic": { - "source": "https://github.com/spin-stack/spin/blob/77380b13da641c24e3f79b9c7586c39888f4e7ba/docs/security/traffic", + "source": "https://github.com/spin-stack/spin/blob/b3598142dbcd6ef24135066332441a400dd35980/docs/security/traffic", "width": 1889, "words": [ "Traffic: every arrow is a connection opened in its direction, and nothing else is let in", diff --git a/src/data/reference.json b/src/data/reference.json index 944d094..1858255 100644 --- a/src/data/reference.json +++ b/src/data/reference.json @@ -1,8 +1,8 @@ { "spin": { "installs": "v20261019.02", - "commit": "77380b13da641c24e3f79b9c7586c39888f4e7ba", - "tag": "", + "commit": "b3598142dbcd6ef24135066332441a400dd35980", + "tag": "v20261024.01", "machine": "v20261014.01" }, "terraform": { diff --git a/versions.yaml b/versions.yaml index 71adfcf..e6944da 100644 --- a/versions.yaml +++ b/versions.yaml @@ -7,8 +7,8 @@ - name: spin kind: git source: https://github.com/spin-stack/spin - version: main - pin: 77380b13da641c24e3f79b9c7586c39888f4e7ba + version: v20261024.01 + pin: b3598142dbcd6ef24135066332441a400dd35980 track: github-release note: >- A commit of main, not a release: v20261019.02, the newest, has no feature board, and the site From 88b8413e2562c37645fd847a07f97838e839a4ee Mon Sep 17 00:00:00 2001 From: Manuel de Brito Fontes Date: Sat, 24 Oct 2026 20:30:50 -0300 Subject: [PATCH 2/2] sources: spin's note says it documents a release now Co-Authored-By: Claude Opus 5.5 --- versions.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/versions.yaml b/versions.yaml index e6944da..2e27376 100644 --- a/versions.yaml +++ b/versions.yaml @@ -11,9 +11,9 @@ pin: b3598142dbcd6ef24135066332441a400dd35980 track: github-release note: >- - A commit of main, not a release: v20261019.02, the newest, has no feature board, and the site - documents the release cut from main after it. A bump moves to a release only once one holds - this commit, never back to an older one. Private: fetched with the sources App's token. + The release the site documents (D2: the newest, exactly). The daily sync moves it to the next + release, never back to an older one; spin main past it is in spin's "Site vs spin main" + issue. Private: fetched with the sources App's token. - name: spin-terraform-aws kind: git