feat(#7229)!: move to OpenShell 0.1.2 - #7233
Conversation
|
🤖 Finished Review · ✅ Success · Started 12:21 PM UTC · Completed 12:40 PM UTC Commit: Runtime: pi · Model: sonnet → claude-sonnet-5 · Effort: high · Cost: $4.43 |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
|
Risk Assessment: elevated (3/5) DetailsScore remains anchored at 3 (elevated), unchanged following the incremental 0.1.2 patch bump: while linked issue #7229 aligns with PR scope, the change spans 26 files touching 3 protected CI workflow paths, displays elevated regression history and change coupling on runner VM components, and introduces a breaking OpenShell schema migration with no opt-out rollback mechanism. Previous runRisk Assessment: elevated (3/5) DetailsScore remains anchored at 3 (elevated), unchanged from prior review rounds: while linked issue #7229 aligns with PR scope, the change touches 26 files across 3 protected CI workflow paths, exhibits elevated regression history and change coupling on runner VM components, and executes a breaking OpenShell 0.1.1 schema migration with no opt-out rollback mechanism. Previous run (2)Risk Assessment: elevated (3/5) DetailsScore remains anchored at 3 (elevated), unchanged from the prior five review rounds: while linked issue #7751 aligns with PR scope, the change touches 26 files across 3 protected CI workflow paths, exhibits elevated regression history and change coupling on runner VM components, and executes a breaking OpenShell 0.1.1 schema migration with no opt-out rollback mechanism (irreversible schema/credential-validation change). Previous run (3)Risk Assessment: elevated (3/5) DetailsScore remains anchored at 3 (elevated), unchanged from the prior four review rounds: while linked issue #7751 aligns with PR scope, the change touches 26 files across 3 protected CI workflow paths, exhibits elevated regression history and change coupling on runner VM components, and executes a breaking OpenShell 0.1.1 schema migration without an opt-out rollback mechanism. The single new commit since the prior assessment (completing the TLS-directory wipe alongside the gateway-directory wipe) is a small in-scope fix that does not change Tier 1 signals. Previous run (4)Risk Assessment: elevated (3/5) DetailsScore remains anchored at 3 (elevated): while linked issue #7751 aligns with PR scope, the change touches 26 files across 3 protected CI workflow paths, exhibits elevated regression history on runner VM components, and executes a breaking OpenShell 0.1.1 schema migration without an opt-out rollback mechanism. Previous run (5)Risk Assessment: elevated (3/5) DetailsScore remains anchored at 3 (elevated): while linked issue #7751 aligns closely with PR scope, the change touches 26 files across 3 protected CI workflow paths, displays elevated regression history and change coupling on runner VM components, and executes a breaking OpenShell 0.1.1 schema migration with no opt-out rollback mechanism. Previous run (6)Risk Assessment: elevated (3/5) DetailsScore remains anchored at 3 (elevated): although linked authorization issue #7751 resolves the prior scope-vs-issue mismatch, the PR spans 26 files across 3 protected CI paths, shows high git coupling and regression history on touched files, and carries a breaking OpenShell 0.1.1 schema/credential migration with no opt-out rollback mechanism. Previous run (7)Risk Assessment: elevated (3/5) DetailsScore increased from 1 (low, prior review of a docs-only version) to 3 (elevated) because the PR expanded to 25 files spanning CI workflows, two protected paths, and a breaking OpenShell config/credential-handling migration, with a scope-vs-issue mismatch and no rollback flag. Previous run (8)Risk Assessment: low (1/5) DetailsRe-review anchoring applied: Tier 1 signals unchanged from the prior assessment (same single docs file, same bot author, no protected/security/dependency/CI changes); Tier 2 shows low churn and no regression/revert history; Tier 3 confirms the linked low-priority issue scope matches the PR closely. Score preserved at 1 (low). Previous run (9)Risk Assessment: low (1/5) DetailsDocs-only, additive, single-file PR by a bot author with no protected paths, security-sensitive files, dependency changes, or CI workflow changes, low churn on the file, and a linked low-priority issue whose scope exactly matches the PR. |
ReviewFindingsMedium
Low
Correctness, style-conventions, intent-coherence, and docs-currency sub-agent passes returned no findings against the current diff. In particular, the previously-fixed Previous runReviewFindingsMedium
Low
Correctness, intent-coherence, style-conventions, and docs-currency sub-agent passes returned no findings against the current diff. In particular, the previously-fixed Next steps:
Previous run (2)ReviewFindingsMedium
Low
The install-before-migrate ordering fix ( Previous run (3)ReviewFindingsMedium
Low
The prior medium finding about Previous run (4)ReviewFindingsMedium
Low
A challenger pass adversarially re-examined this finding set; it argued for removing the Other findings from earlier review rounds (the Next steps:
Previous run (5)ReviewFindingsMedium
Low
Other prior findings from the previous review round (the Previous run (6)ReviewFindingsHigh
Medium
Low
Labels: PR modifies CI scripts/workflows and self-hosted install tooling for the OpenShell runtime. Next steps:
Previous run (7)ReviewFindingsHigh
Medium
Low
Next steps:
Previous run (8)Looks good to me Previous run (9)ReviewFindingsHigh
Medium
These findings should be addressed before merge: the high finding corrects a factual claim that is central to the annotation's purpose (documenting the real reason a signal-delivery approach was abandoned), and the medium finding brings the addition's formatting in line with this repo's Accepted-ADR annotation convention. Next steps:
|
|
🤖 Finished Fix · ✅ Success · Started 12:42 PM UTC · Completed 12:48 PM UTC Commit: Runtime: claude · Model: sonnet → claude-sonnet-5 · Effort: high · Cost: $1.01 |
🔧 Fix agent — iteration 1 (bot-triggered)Fixed both review findings on PR #7233 by correcting the ADR's overstated signal-delivery claim (distinguishing the original exec channel's signal-propagation limitation from the working second-exec kill-INT side-channel, and correcting the stated reason PR #7208 was closed) and by wrapping the new subsection fully in a blockquote to match the file's existing annotation convention. Verified both findings against PR #7208's actual body/closing comment and the production code in internal/runtime/stray_processes.go before making changes. Docs-only change: ran the ADR/doc lint scripts directly (lint-adr-status, lint-adr-numbers, lint-adr-frontmatter, lint-docs-links, lychee link check) since pre-commit could not fetch remote hook repos (HTTP 403, same infra issue noted in the original PR description), plus gitleaks and a trailing-whitespace/EOF check - all passed. No Go code changed, so no test suite or coverage gate applies. Fixed (2):
Tests: passed Decision points
Next steps:
|
Addresses fullsend-ai-review findings on PR #7233: - The annotation overstated OpenShell's signal contract: it read as if no in-sandbox SIGINT delivery is possible, when only the original sandbox exec channel cannot propagate host-side signals. A second, independent sandbox exec that runs kill -INT <pid> against a known guest PID does deliver the signal - E2E-verified in PR #7208 and already used in production (killStrayProcessesTemplate in internal/runtime/stray_processes.go) for TERM/KILL. Rewrote the Command-execution pointer and the Signal and lifecycle semantics subsection to distinguish the two exec paths, and corrected the stated reason PR #7208 was closed (unsupported side-channel outside OpenShell's contract, Claude-only PID-file coverage, and total_cost_usd being a non-authoritative estimate - not failed signal delivery). - The new subsection mixed a 3-line blockquoted note with ~20 lines of unmarked prose, inconsistent with this file's existing post-acceptance annotation convention (the #6691 note). Wrapped the entire subsection in the blockquote so it reads unambiguously as an annotation rather than a new peer Decision subsection. Addresses #7233
|
🤖 Finished Review · ✅ Success · Started 12:50 PM UTC · Completed 1:02 PM UTC Commit: Runtime: pi · Model: sonnet → claude-sonnet-5 · Effort: high · Cost: $2.27 |
Superseded by updated review
|
/fs-fix-stop |
|
Fix agent disabled for this PR. Remove the |
cd5da60 to
aabf486
Compare
Addresses fullsend-ai-review findings on PR #7233: - The annotation overstated OpenShell's signal contract: it read as if no in-sandbox SIGINT delivery is possible, when only the original sandbox exec channel cannot propagate host-side signals. A second, independent sandbox exec that runs kill -INT <pid> against a known guest PID does deliver the signal - E2E-verified in PR #7208 and already used in production (killStrayProcessesTemplate in internal/runtime/stray_processes.go) for TERM/KILL. Rewrote the Command-execution pointer and the Signal and lifecycle semantics subsection to distinguish the two exec paths, and corrected the stated reason PR #7208 was closed (unsupported side-channel outside OpenShell's contract, Claude-only PID-file coverage, and total_cost_usd being a non-authoritative estimate - not failed signal delivery). - The new subsection mixed a 3-line blockquoted note with ~20 lines of unmarked prose, inconsistent with this file's existing post-acceptance annotation convention (the #6691 note). Wrapped the entire subsection in the blockquote so it reads unambiguously as an annotation rather than a new peer Decision subsection. Addresses #7233
|
🤖 Review · Commit: |
Site previewPreview: https://a993e609-site.fullsend-ai.workers.dev Commit: |
|
@Aliciapet11 thanks, good catch. 3f3f5ea rewrites the upgrade note in
Writing the config before installing also fixes an ordering problem: on Linux packages the installer starts the gateway right away, so the old order ("install, then write the config") brought it up against the v1 file and it failed with Step 3 was run as written under bash and zsh on macOS and bash on Fedora, including a re-run on an already-moved tree. |
|
🤖 Finished Review · ✅ Success · Started 12:51 PM UTC · Completed 1:16 PM UTC Commit: Runtime: pi · Model: sonnet → claude-sonnet-5 · Effort: high · Cost: $11.61 |
|
Local verification of 3f3f5ea on OpenShell 0.1.1, with fullsend-ai/agents#1513:
|
The note said Homebrew keeps the gateway state under $(brew --prefix)/var/openshell and told readers to move that directory aside. Homebrew's service wrapper keeps the gateway database in the same XDG state directory as Linux, so following the note left the 0.0.x database, with its old providers, in place and moved Homebrew's TLS instead. The steps are the same with Homebrew apart from the service commands: stop and start the gateway with brew services. A config under $XDG_CONFIG_HOME takes precedence over Homebrew's own, and the installer manages Homebrew's TLS. Verified on macOS arm64 by upgrading a 0.0.116 Homebrew install that held providers created by a real run to 0.1.2 with these steps. Assisted-by: Claude Signed-off-by: Wayne Sun <gsun@redhat.com>
OpenShell 0.1.2 is a bug-fix release on top of 0.1.1 with no breaking changes. It fixes bytes being dropped on proxied connections, the Homebrew config migration, and reaps orphaned processes as soon as they exit. Its packaged gateway config is unchanged from 0.1.1. Bump the pin (and the installer commit), the local-run doc's version and supervisor image, and the GitLab runner VM fallback versions. PID 1's arguments changed in 0.1.2, so the stray-process comment no longer quotes them; the sweep never matched on them. Verified on macOS arm64 and Fedora 44 x86_64: triage on claude, codex and pi after upgrading from 0.1.1. On Fedora, the stray-process sweep killed a planted orphan and spared PID 1 and the keep-alive; on macOS, the full upgrade from 0.0.116 followed by the same triage runs. Supersedes #7763. Assisted-by: Claude Signed-off-by: Wayne Sun <gsun@redhat.com>
|
🤖 Finished Review · ✅ Success · Started 4:32 PM UTC · Completed 4:50 PM UTC Commit: Runtime: pi · Model: sonnet → claude-sonnet-5 · Effort: high · Cost: $7.56 |
Superseded by updated review
waynesun09
left a comment
There was a problem hiding this comment.
Approving. fullsend-ai/agents#1513 is merged (a05e2b356), so the credential-declaration half is on agents main; the failed e2e/behaviour jobs are re-running against it before enqueue. Verified locally on OpenShell 0.1.2 (macOS arm64 and Fedora 44 x86_64): claude, codex and pi triage, the stray-process sweep, and the documented upgrade from 0.0.116. All review threads are resolved.
|
Merged together with fullsend-ai/agents#1513 (both via a maintainer bypass, since their pre-merge CI could not pass until the other landed; both rulesets restored afterwards). The e2e re-run against the merged agents Follow-ups:
|
OpenShell 0.1.x validates every provider credential against the profile's declared credentials: list, and it accepts a provider with no credentials. The _NOOP_* empty-map placeholders that papered over NVIDIA/OpenShell#1978 are now rejected as undeclared. - Declare GH_TOKEN / GITLAB_TOKEN / JIRA_TOKEN on the six token-bearing profiles, matching fullsend's fullsend-openai shape without auth_style, header_name, or refresh. - Drop the credentials: block from vertex-ai, gitleaks, package-registries, and github-artifacts. - Add a unit test that locks the declarations in. .github/workflows/functional-tests.yml still writes gateway schema v1; a maintainer must switch it to schema v2 on this PR (workflow permissions). Lands with fullsend-ai/fullsend#7233; no 0.0.x compatibility is kept. Note: pre-commit could not fetch hook repos (HTTP 403). Hooks were run directly at the pinned revs (check-yaml, end-of-file-fixer, trailing-whitespace, detect-private-key, check-added-large-files, check-merge-conflict, mixed-line-ending, shellcheck, gitleaks) and passed. BREAKING CHANGE: Credential-less providers no longer send a dummy credential. OpenShell 0.0.x still refuses an empty credential map, so this repo requires OpenShell 0.1.1. Closes fullsend-ai#1512
Summary
Moves fullsend to OpenShell v0.1.2 (0.1.2 is a bug-fix release on top of 0.1.1; it supersedes Renovate's #7763). OpenShell 0.1 is a clean break from 0.0.x: gateway config schema v2, provider credentials validated against the profile, and fast SIGTERM
sandbox stop/ async delete. No 0.0.x compatibility is kept, because fullsend pins the version in CI and local installs need a clean reinstall anyway.This PR began as the ADR 0030 annotation for #7229. That annotation is kept and updated for 0.1.x.
Breaking changes
action.ymlgateway config is schema v2. A gateway older than 0.1 rejects that config, and 0.1 rejects a v1 config. Nothing that runs the action needs to act: it installs the pinned OpenShell on a fresh runner.OPENSHELL_ACK_BREAKING_UPGRADE=1.running-agents-locally.mdwalks through it.hack/gitlab-runner-vm/setup.shdoes it automatically, but an existing VM needssetup.shre-run (or the VM recreated): its installed executor still trusts its own 0.0.116 pin and refuses a job image that reports 0.1.1._NOOP_*/placeholder credentials drop them, and profiles declare real tokens undercredentials:.@mainmoves as soon as this merges; one on the moving@v0tag moves at the next release. At that point, a repo whose own config has provider files with a placeholder credential (such as the old_PLACEHOLDER_GATE_QUERYexample) or a credential its profile does not declare fails at provider creation withcredentials are not declared by profile '<id>': <KEY>. The fix is to remove the placeholder, or declare the credential under the profile'scredentials:. Repos that use only the default provider files need no change.Related issues
Closes #7751 (the OpenShell 0.1 migration). Closes #7229.
Related: #4808 (this PR re-syncs the doc's version once; it doesn't add the Renovate tracking #4808 asks for), #6708 (version/SHA consistency check), #6849 (version-gated flags), #4076 (Renovate release age), #6716 (placeholder-in-body reset).
Upstream: NVIDIA/OpenShell#1978 (credential-less providers, closed), #2855 / #3036 (stop SIGTERM), #3159 (per-exec kill, not planned).
Companion: fullsend-ai/agents#1512, which declares provider credentials in the agents profiles and drops
_NOOP_*. The two merge back to back.Changes
.github/scripts/openshell-version.sh: 0.1.2 (6648bd0c2).install-openshell.shprints the gateway journal when an install attempt fails.functional-tests.yml: OpenShell is installed after the Podman API socket is up, because the pinned podman driver keeps the gateway from starting without it.action.yml,functional-tests.yml: schema v2 gateway config.compute_driver = "podman"goes under[openshell.gateway];supervisor_imageandhealth_check_interval_secs = 10go under[openshell.drivers.podman], matching upstream's packaged default.providers/*.yaml: the_NOOP_*placeholder credentials are removed. 0.1.x creates a provider with no credentials and rejects any credential the profile does not declare.run_openai.go: the run-scoped OpenAI provider is created with its value, and the expiry is attached in the next call. 0.1.x refuses an empty value for a declared credential and takes an expiry only on update. If both the store and the delete fail, the credential is now expired in place rather than blanked, because blanking is refused on 0.1.x.stray_processes.go: the process-view comment is updated for 0.1.x. PID 1 is nowopenshell-sandbox, running as the sandbox user (its arguments differ between 0.1.1 and 0.1.2; the sweep never matches on them); it is spared as an ancestor.running-agents-locally: 0.1.2, the v2 config, and a clean upgrade from 0.0.x as runnable steps (XDG paths; with Homebrew only the service commands differ).bring-your-own-agent,gate-binaries: providers without a secret carry no credentials, and a token a provider does carry must be declared by its profile.hack/gitlab-runner-vm/:pin_supervisor_imagewritessupervisor_imageunder[openshell.drivers.podman]in a v2 file. A v1 or version-less file is moved aside togateway.toml.pre-0.1. Bothinstall.shpaths setOPENSHELL_ACK_BREAKING_UPGRADE=1, andsetup.shand the per-jobensure_job_openshell_gatewaystop the gateway, wipe the pre-0.1 store and TLS, and write the v2 config before installing. Unit-tested with stubs only (all*_test.shpass on Fedora 43 and 44, six mutations caught); not run on a live VM.Testing
The items below through
go testran locally on OpenShell v0.1.1 (Homebrew, macOS arm64, podman driver), with fullsend built from this branch and the agents profiles from agents#1512 applied:triageon claude (claude-opus-4-6): providers ready,ghthrough the proxy,Validation: passed, sandbox deleted in 0.5 s (was ~47 s).triageon codex 0.157.0: run-scoped OpenAI provider created, transcript kept,Validation: passed. On the kept sandbox,sandbox stoptook 0.15–0.28 s and start-to-exec 0.38–0.52 s; codex state survived.triageon pi withopenai/gpt-5.6-luna: OpenAI, Vertex and GitHub providers all ready,Validation: passed.nohuporphan. The orphan was killed; PID 1 and the keep-alive were spared.go test ./internal/cli/ ./internal/runtime/ ./internal/scaffold/ ./internal/harness/, and scaffold profiles passopenshell provider profile linton 0.1.1.triageon claude, and on codex and pi withopenai/gpt-5.6-luna, allValidation: passed. On Fedora the stray-process sweep killed a planted orphan and spared PID 1 and the keep-alive. On macOS, a Homebrew 0.0.116 install holding providers from a real run was upgraded to 0.1.2 with the doc's steps, and the same three runs passed with the providers recreated.triageon claude, and on codex and pi withopenai/gpt-5.6-luna, allValidation: passed. Therunning-agents-locallyupgrade block was run as written, starting from a real 0.0.116 install with its v1 config and state; the 0.1.1 gateway started on the first try.functional-testsruns onpull_request_target, so it executesmain's workflow: the run on 1c03686 wrotemain's v1 config next to this PR's 0.1.1 pin, and the gateway refused it (category=legacy_schema_v1).behaviour/e2edispatch runs that use agentsmain, whose profiles lack the credential declarations from agents#1513.mainafter both merge is the Linux check.install-openshell.shnow prints the gateway journal on failure, which is how thelegacy_schema_v1cause was found.