Login
Check-in [6912141fbe]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Terminate works on any workspace, whatever state its making left it in

Purpose: stone, 2026-10-01: the failed Add left "cruft", and the workspace list "doesn't provide a Delete button". Then: "a workspace clean-up is a workspace clean-up, be it made by an errant flow or not". The workspace page refused a directory with no binding, and so did terminate.

Shape: - Terminate is one flow for every workspace. Each step applies to what the workspace has: - refused while a process runs in it; - synced when it is bound; - refused while its clone, if it has one, holds artifacts the repository lacks; - its end noted on its record, if it has one; - then removed. - The workspace page renders for any workspace directory. It shows its definition and a job's Run form when it has a record, its session or the start form, and always Terminate.

Origin: opus, on the maintainer's report. Intent: whatever made a workspace, it can be cleaned up the same way. Expression: src/ocx/cgi.cr, src/ocx/cgi_workspaces.cr. Demonstrates: spec/ocx/console_workspaces_spec.cr, crystal run ci.cr: - a workspace directory with no binding is listed, its page offers Terminate, and Terminate removes it; - a second Terminate says there is none; - bound workspaces terminate as before; - CI green, 234 examples.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UrDxZLxg3rJ9AQNcwDvo3n

Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | ocx | audited | ci
Files: files | file ages | folders
SHA3-256: 6912141fbe6989c14ef086102161bdcd79bb59e649725d5c43804e8e1f960662
User & Date: opus 2026-10-01 14:36:21.478
Context
2026-10-01
14:46
A workspace's fossil runs with the workspace as HOME, stated, not inherited

Purpose: stone, 2026-10-01: Add the workspace failed again, "fossil clone failed: cannot locate home directory". Fossil's server gives its CGI no HOME. Dropping the CGI variables (666c151f57) still left fossil depending on what it inherited; the maintainer: "environment variable dependencies rear their ugly head again ... we should manage them better".

Shape: - Workspace.fossil now requires `home`. It always runs fossil in a clean environment (HOME and PATH only) whose HOME is the workspace itself, as its sandbox gives its sessions. - Workspace.create (clone, remote, settings), the remote and peer setup, and Workspace#sync all state it. - So do the command runner's and the job's update, info and tag. - WorkTree.fossil runs with the tree's workspace (its parent) as HOME. - A clone over HTTP names its admin user (-A LOGIN), as a file clone already did: a clean environment has no $USER to fall back on. - The same fossil commands now run the same way from the console, the daemon or a terminal.

Origin: opus, on the maintainer's report. Intent: no fossil call that touches a workspace depends on its caller's environment. Expression: src/ocx/workspace.cr, src/ocx/worktree.cr, src/ocx/command_runner.cr, src/ocx/job.cr. Demonstrates: spec/ocx/workspace_spec.cr, crystal run ci.cr: - a workspace is created from a process with a CGI request's variables and no HOME, XDG_CONFIG_HOME or FOSSIL_HOME; - before this change the spec failed with the maintainer's error, first at the clone, then at the tree's `fossil open`; - CI green, 234 examples.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UrDxZLxg3rJ9AQNcwDvo3n check-in: bbbd12aa26 user: opus tags: ocx, audited, ci

14:36
Terminate works on any workspace, whatever state its making left it in

Purpose: stone, 2026-10-01: the failed Add left "cruft", and the workspace list "doesn't provide a Delete button". Then: "a workspace clean-up is a workspace clean-up, be it made by an errant flow or not". The workspace page refused a directory with no binding, and so did terminate.

Shape: - Terminate is one flow for every workspace. Each step applies to what the workspace has: - refused while a process runs in it; - synced when it is bound; - refused while its clone, if it has one, holds artifacts the repository lacks; - its end noted on its record, if it has one; - then removed. - The workspace page renders for any workspace directory. It shows its definition and a job's Run form when it has a record, its session or the start form, and always Terminate.

Origin: opus, on the maintainer's report. Intent: whatever made a workspace, it can be cleaned up the same way. Expression: src/ocx/cgi.cr, src/ocx/cgi_workspaces.cr. Demonstrates: spec/ocx/console_workspaces_spec.cr, crystal run ci.cr: - a workspace directory with no binding is listed, its page offers Terminate, and Terminate removes it; - a second Terminate says there is none; - bound workspaces terminate as before; - CI green, 234 examples.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UrDxZLxg3rJ9AQNcwDvo3n check-in: 6912141fbe user: opus tags: ocx, audited, ci

14:23
No fossil started by OCX inherits a CGI request's variables

Purpose: stone, 2026-10-01: Add the workspace failed with "addworkspace: fossil clone failed: no such file: clone". The console runs Workspace.create in its own process. Fossil, finding GATEWAY_INTERFACE, answered `fossil clone` as a CGI request for a file named "clone". Provisioning had the same failure once and was fixed at its own calls (home:); every other path still inherited the request.

Shape: Fossil.run, the one place fossil is started, unsets the CGI variables (Fossil::CGI_ENV: GATEWAY_INTERFACE, REQUEST_METHOD, QUERY_STRING, PATH_INFO, SCRIPT_NAME, REQUEST_URI, CONTENT_LENGTH, CONTENT_TYPE) whenever it keeps this process's environment. With `home` it already started from a clean one.

Origin: opus, on the maintainer's report. Intent: fossil always runs as a command, whoever starts it. Expression: src/ocx/fossil.cr. Demonstrates: spec/ocx/workspace_spec.cr, crystal run ci.cr: - a workspace is created from a process carrying a CGI request's variables; - without the fix the spec fails with the maintainer's exact error, "fossil clone failed: no such file: clone"; - CI green, 234 examples.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UrDxZLxg3rJ9AQNcwDvo3n check-in: 666c151f57 user: opus tags: ocx, audited, ci

Changes
Unified Diff Side-by-Side Diff Patch
Changes to spec/ocx/console_workspaces_spec.cr.
Changes to src/ocx/cgi.cr.
Changes to src/ocx/cgi_workspaces.cr.