Dashboard › opencode › Session 0lWzqKvhQ0x7
0lWzqKvhQ0x7o6ocGPerform a substantive independent READ-ONLY security review of the exact current files under /home/byk/.local/share/opencode-v2-pilot/supervisor, /home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty.ts, /home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty-transport.ts, /home/byk/.local/share/opencode-v2-pilot/opencode-v2.service, and /home/byk/.local/share/opencode-v2-pilot/CUTOVER.md. This is a fresh review after a major revision. Inspect every changed source/test/unit/doc and all three binaries; verify hashes and reproducible source builds. Threat model same-UID malicious descendants, inherited/passed authenticated fds, PID reuse/service restart, untrusted model command/input/output, protocol abuse, D-Bus/systemd compromise, Docker/lxd/sudo supplementary groups, ptrace/same-UID process attacks, cgroup/process escape, cwd TOCTOU, resource exhaustion, orphan units, and root parser attack surface. Verify correct systemd interfaces and property types, SO_PEERCRED/SO_PEERPIDFD/InvocationID pinning through start, helper inability to connect or accept paths, CLOEXEC and fd inheritance behavior, root/transient hardening, external delegation paths, admission/rate bounds, fail-closed cleanup, readiness marker content binding, and absence of direct-spawn fallback. Do not edit files, install/start services, or perform privileged operations. You may run unprivileged tests and offline analyzers. Cite current file:line evidence, classify PASS/CONCERN/MUST-FIX, name exact blockers, and end exactly MERGE or DO-NOT-MERGE.
I’ll freeze the review scope first: inventory every target file and binary, capture hashes and metadata, then trace the protocol, authentication, systemd lifecycle, containment, tests, and build path against the exact on-disk revision. I will keep all actions read-only and use only unprivileged offline checks.
[
{
"content": "Inventory exact target files, binaries, metadata, and hashes",
"status": "in_progress",
"priority": "high"
},
{
"content": "Inspect every supervisor source, test, unit, plugin, transport, and cutover document",
"status": "pending",
"priority": "high"
},
{
"content": "Trace authentication, descriptor inheritance, protocol, lifecycle, and cleanup invariants",
"status": "pending",
"priority": "high"
},
{
"content": "Verify systemd interfaces, hardening, containment, resource bounds, and external delegation",
"status": "pending",
"priority": "high"
},
{
"content": "Rebuild all binaries reproducibly and compare hashes",
"status": "pending",
"priority": "high"
},
{
"content": "Run permitted unprivileged tests and offline analyzers",
"status": "pending",
"priority": "high"
},
{
"content": "Produce evidence-based PASS/CONCERN/MUST-FIX verdict",
"status": "pending",
...
File not found: /bots
<path>/home/byk/Code/opencode</path> <type>directory</type> <entries> .dockerignore .editorconfig .git/ .gitattributes .github/ .gitignore .gitleaksignore .husky/ .lore.md .node-cache/ .opencode/ .oxlintrc.json .prettierignore .turbo/ .vscode/ .zed/ AGENTS.md artifacts/ bun.lock bunfig.toml CONTEXT.md CONTRIBUTING.md flake.lock flake.nix github/ infra/ install LICENSE nix/ node_modules/ package.json packages/ patches/ perf.data perf.data.old perf/ pnpm-lock.yaml pnpm-workspace.yaml README.ar.md README.bn.md README.br.md README.bs.md README.da.md README.de.md README.es.md README.fr.md README.gr.md README.it.md README.ja.md README.ko.md README.md README.no.md README.pl.md README.ru.md README.th.md README.tr.md README.uk.md README.vi.md README.zh.md README.zht.md screenshot-uk.png script/ sdks/ SECURITY.md specs/ sst-env.d.ts sst.config.ts STATS.md tsconfig.json turbo.json (70 entries) </entries>
File not found: /home/byk/.local/share/opencode-local Did you mean one of these? /home/byk/.local/share/opencode
/home/byk/.local/share/opencode-v2-pilot-test/data/opencode/opencode.db-shm /home/byk/.local/share/opencode-v2-pilot-test/data/opencode/opencode.db-wal /home/byk/.local/share/opencode-v2-pilot-test/data/opencode/opencode.db /home/byk/.local/share/opencode-v2-pilot-test/data/opencode/log/opencode.log /home/byk/.local/share/opencode-v2-pilot-next/data/opencode/opencode.db-shm /home/byk/.local/share/opencode-v2-pilot-next/data/opencode/opencode.db-wal /home/byk/.local/share/opencode-v2-pilot-next/data/opencode/opencode.db /home/byk/.local/share/opencode-v2-pilot-next/data/opencode/log/opencode.log /home/byk/.local/share/opencode-v2-pilot/supervisor/ROOT-ACCEPTANCE.md /home/byk/.local/share/opencode-v2-pilot/supervisor/PROTOCOL.md /home/byk/.local/share/opencode-v2-pilot/supervisor/bin/opencode-pty-client /home/byk/.local/share/opencode-v2-pilot/supervisor/bin/opencode-pty-launcher /home/byk/.local/share/opencode-v2-pilot/supervisor/bin/opencode-pty-supervisor /home/byk/.local/share/openco...
/home/byk/.local/share/opencode-v2-pilot/supervisor/ROOT-ACCEPTANCE.md /home/byk/.local/share/opencode-v2-pilot/supervisor/go.sum /home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/client/main_test.go /home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/client/main.go /home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/supervisor/main.go /home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/launcher/main.go /home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/launcher/main_test.go /home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/auth_test.go /home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/server.go /home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/auth.go /home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/systemd.go /home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/server_test.go /home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/systemd_...
/home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty-transport.ts /home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty.ts /home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/followup.ts
fb8739d98ff7882782005e04ef731b6120e8daf0719e606362a1fe620adc2cde bin/opencode-pty-client d833c859476f021565e8f425e6ee51353909060fa5f64ce629fb07d3411987dd bin/opencode-pty-launcher c5c09ece21c802868721dfc3e2610496ad9630c1b3a4c258104bc92b2bd9aca1 bin/opencode-pty-supervisor bin/opencode-pty-client|mode=755|uid=1000|gid=1000|size=2109912|mtime=2026-09-08 06:38:38.524405811 +0000 bin/opencode-pty-launcher|mode=755|uid=1000|gid=1000|size=2098942|mtime=2026-09-08 06:38:38.512405908 +0000 bin/opencode-pty-supervisor|mode=755|uid=1000|gid=1000|size=4407495|mtime=2026-09-08 06:38:38.491406077 +0000 bin/opencode-pty-client: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, with debug_info, not stripped bin/opencode-pty-launcher: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, with debug_info, not stripped bin/opencode-pty-supervisor: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, with debug_info, not stripped go ...
9f70a745367e68d0f35aa14cb5048b8c83652cf10e279539ab16f25037757f1a ROOT-ACCEPTANCE.md 2a588cef62538063cbe7f3dbc27305a7e8e2511a59a86c6cec6b5b18b1b2275f PROTOCOL.md d1d088bdd65f99056657717658d3336ae233acd2ad39fa998ebe8a773f68348e go.mod dad6a6773121326ee41a6a081cf310444b6fcd3540f28f4b3f31de559d31726b go.sum 5f03c865c17fbb54e2fa3a0e0c7cbf899ad4509228d1a7262aaa4ea3387b9e20 opencode-pty.slice 63414c4afc3e4bad52d4738e9bfd1886a312012663dd4eb7390481cc50636239 opencode-pty-supervisor.service 9471c8c9dd2a8c00274e1e6ecc89983377c3810e2a7ad47b962df19ce6d2995b cmd/client/main.go 506fe06b72e9859bdd101b2c048b63c6b866a290a1ab27311ccaff9bdd23658b cmd/client/main_test.go c5fef296d93af561b99284f9e73bdd9569d8501f92bd34bf47a10ae2fe03f41b cmd/launcher/main.go e584ce5e320bc8c9dc6c250c548bbae517fa6ecdc721a5813cd6bb148fc3b090 cmd/launcher/main_test.go d7381fa5feeacacbf94cddbf36539f8544ccab9705fa4b7906207726d67c387d cmd/supervisor/main.go 83ef89be747e6c1bd51ba1474307980dd4e9d4c1d17360be1c02538c990f832d ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/auth.go</path>
<type>file</type>
<content>
1: package supervisor
2:
3: import (
4: "bytes"
5: "context"
6: "errors"
7: "fmt"
8: "net"
9:
10: "golang.org/x/sys/unix"
11: )
12:
13: type authenticatedPeer struct {
14: credential *unix.Ucred
15: pidfd int
16: identity clientIdentity
17: }
18:
19: func authenticate(ctx context.Context, connection *net.UnixConn, manager unitManager, expectedUID uint32, expectedGID uint32) (*authenticatedPeer, error) {
20: credential, pidfd, err := peerIdentity(connection)
21: if err != nil {
22: return nil, err
23: }
24: peer := &authenticatedPeer{credential: credential, pidfd: pidfd}
25: if err := peer.validateCredentials(expectedUID, expectedGID); err != nil {
26: peer.Close()
27: return nil, err
28: }
29: identity, err := manager.ClientState(ctx)
30: if err != nil {
31: peer.Close()
32: return nil, fmt.Errorf("query client service: %w", ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/server.go</path>
<type>file</type>
<content>
1: package supervisor
2:
3: import (
4: "context"
5: "crypto/rand"
6: "encoding/binary"
7: "errors"
8: "fmt"
9: "io"
10: "log"
11: "net"
12: "os"
13: "os/user"
14: "strconv"
15: "sync"
16: "syscall"
17: "time"
18: "unicode/utf8"
19:
20: "opencode-pty-supervisor/internal/protocol"
21:
22: "golang.org/x/sys/unix"
23: )
24:
25: const (
26: socketPath = "/run/opencode-pty/supervisor.sock"
27: maxSessions = 16
28: maxUnauthenticated = 32
29: maxAdmissionsPerMinute = 120
30: socketBufferSize = 128 * 1024
31: handshakeTimeout = 5 * time.Second
32: )
33:
34: var errStopRequested = errors.New("client requested stop")
35:
36: type Server struct {
37: manager unitManager
38: listener *net.UnixListener
39: sessions chan struct{}
40: unauthenticated chan struct{}
41: connections ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/systemd.go</path> <type>file</type> <content> 1: package supervisor 2: 3: import ( 4: "context" 5: "encoding/base64" 6: "errors" 7: "fmt" 8: "net" 9: "os" 10: "regexp" 11: "time" 12: 13: systemddbus "github.com/coreos/go-systemd/v22/dbus" 14: "github.com/godbus/dbus/v5" 15: ) 16: 17: const ( 18: clientService = "opencode-v2.service" 19: supervisorService = "opencode-pty-supervisor.service" 20: ptySlice = "opencode-pty.slice" 21: expectedClientCgroup = "/system.slice/opencode-v2.service" 22: launcherPath = "/usr/local/libexec/opencode-pty-launcher" 23: unitPrefix = "opencode-pty-" 24: unitSuffix = ".service" 25: operationTimeout = 5 * time.Second 26: stopTimeout = 15 * time.Second 27: outputDrainTimeout = 2 * time.Second 28: defaultRuntimeSec = 3600 29: perSessionMemoryMax = 512 * 1024 * 1024 30: ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/launcher/main.go</path>
<type>file</type>
<content>
1: package main
2:
3: import (
4: "encoding/base64"
5: "errors"
6: "fmt"
7: "os"
8: "strings"
9: "syscall"
10:
11: "opencode-pty-supervisor/internal/protocol"
12:
13: "golang.org/x/sys/unix"
14: )
15:
16: const encodedArgumentsEnvironment = "OPENCODE_PTY_ARGV"
17:
18: const launcherFD = 3
19:
20: func main() {
21: if err := run(os.Args[1:]); err != nil {
22: fmt.Fprintln(os.Stderr, err)
23: os.Exit(1)
24: }
25: }
26:
27: func run(values []string) error {
28: if len(values) == 1 && values[0] == "--exec" {
29: return execCommand()
30: }
31: if _, err := decodeArguments(values); err != nil {
32: return err
33: }
34: if err := syscall.Fchdir(2); err != nil {
35: return fmt.Errorf("fchdir approved cwd: %w", err)
36: }
37: if err := syscall.Dup2(1, 2); err != nil {
38: return fmt.Errorf("replace cwd descriptor: %w", err)
39: }
40: if err := ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/client/main.go</path>
<type>file</type>
<content>
1: package main
2:
3: import (
4: "encoding/base64"
5: "errors"
6: "fmt"
7: "os"
8: "strconv"
9: "strings"
10: "syscall"
11:
12: "opencode-pty-supervisor/internal/protocol"
13:
14: "golang.org/x/sys/unix"
15: )
16:
17: const (
18: socketFD = 3
19: cwdFD = 4
20: )
21:
22: func main() {
23: if err := sendStart(socketFD, cwdFD, os.Args[1:]); err != nil {
24: fmt.Fprintln(os.Stderr, err)
25: os.Exit(1)
26: }
27: }
28:
29: func sendStart(socket, cwd int, values []string) error {
30: unix.CloseOnExec(socket)
31: unix.CloseOnExec(cwd)
32: if _, err := unix.Getpeername(socket); err != nil {
33: return fmt.Errorf("validate inherited connected socket: %w", err)
34: }
35: var stat unix.Stat_t
36: if err := unix.Fstat(cwd, &stat); err != nil {
37: return fmt.Errorf("inspect inherited cwd: %w", err)
38: }
39: if stat.Mode&unix.S_IFMT != unix.S_IFDIR ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/internal/protocol/frame.go</path>
<type>file</type>
<content>
1: package protocol
2:
3: import (
4: "encoding/binary"
5: "errors"
6: "fmt"
7: "io"
8: "strings"
9: "unicode/utf8"
10: )
11:
12: const (
13: HeaderSize = 12
14: MaxFrameSize = 70 * 1024
15: MaxIOPayloadSize = 32 * 1024
16: Version = 1
17:
18: TypeStart = 1
19: TypeInput = 2
20: TypeOutput = 3
21: TypeExit = 4
22: TypeError = 5
23: TypeStarted = 6
24: TypeStop = 7
25: TypeStopped = 8
26:
27: MaxArgs = 128
28: MaxCommandSize = 4096
29: MaxArgSize = 16384
30: MaxArgsSize = 65536
31: MaxRuntimeSec = 3600
32: )
33:
34: var (
35: magic = [4]byte{'O', 'P', 'T', 'Y'}
36: ErrInvalidFrame = errors.New("invalid frame")
37: ErrFrameTooLarge = errors.New("frame too large")
38: )
39:
40: type Frame struct {
41: Type byte
42: Payload []byte
43: }
44:
45: type Start struct {
46: Device ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/supervisor/main.go</path>
<type>file</type>
<content>
1: package main
2:
3: import (
4: "context"
5: "fmt"
6: "os"
7: "os/signal"
8: "syscall"
9:
10: "opencode-pty-supervisor/internal/supervisor"
11: )
12:
13: func main() {
14: ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
15: defer cancel()
16: manager, err := supervisor.NewSystemdManager(ctx)
17: if err != nil {
18: fmt.Fprintln(os.Stderr, err)
19: os.Exit(1)
20: }
21: defer manager.Close()
22: server, err := supervisor.NewServer(manager)
23: if err != nil {
24: fmt.Fprintln(os.Stderr, err)
25: os.Exit(1)
26: }
27: if err := server.Serve(ctx); err != nil {
28: fmt.Fprintln(os.Stderr, err)
29: os.Exit(1)
30: }
31: }
(End of file - total 31 lines)
</content>
<path>/home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty-transport.ts</path>
<type>file</type>
<content>
1: import { spawn } from "node:child_process"
2: import type { ChildProcess } from "node:child_process"
3: import { isUtf8 } from "node:buffer"
4: import { fstatSync } from "node:fs"
5: import { stat } from "node:fs/promises"
6: import type { FileHandle } from "node:fs/promises"
7: import { createConnection } from "node:net"
8: import type { Socket } from "node:net"
9:
10: const MAGIC = Buffer.from("OPTY")
11: const VERSION = 1
12: const HEADER_SIZE = 12
13: const MAX_FRAME_SIZE = 70 * 1024
14: const MAX_IO_PAYLOAD_SIZE = 32 * 1024
15: const TYPE_INPUT = 2
16: const TYPE_OUTPUT = 3
17: const TYPE_EXIT = 4
18: const TYPE_ERROR = 5
19: const TYPE_STARTED = 6
20: const TYPE_STOP = 7
21: const TYPE_STOPPED = 8
22: const DEFAULT_SOCKET_PATH = "/run/opencode-pty/supervisor.sock"
23: const DEFAULT_HELPER_PATH = "/usr/local/libexec/opencode-pty-client"
24: const ...
<path>/home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty.ts</path>
<type>file</type>
<content>
1: import { Plugin } from "@opencode/plugin"
2: import type { Context } from "@opencode/plugin/plugin"
3: import type { ToolContext } from "@opencode/plugin/tool"
4: import { Schema } from "effect"
5: import { spawn } from "node:child_process"
6: import { open, realpath } from "node:fs/promises"
7: import type { FileHandle } from "node:fs/promises"
8: import { constants } from "node:fs"
9: import { assertSupervisorAvailable, openSupervisorTransport } from "./pty-transport"
10: import type { SupervisorOptions, SupervisorTransport } from "./pty-transport"
11:
12: type PtyPluginOptions = SupervisorOptions & {
13: assertAvailable?: typeof assertSupervisorAvailable
14: openTransport?: typeof openSupervisorTransport
15: }
16:
17: const MAX_BUFFER_SIZE = 1_000_000
18: const MAX_SESSIONS = 16
19: const MAX_SESSIONS_PER_OWNER = 5
20: const DEFAULT_READ_LIMIT = 500
21: const ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/auth_test.go</path>
<type>file</type>
<content>
1: package supervisor
2:
3: import (
4: "context"
5: "os"
6: "testing"
7: )
8:
9: type authenticationManager struct {
10: identity clientIdentity
11: }
12:
13: func (manager *authenticationManager) ClientState(context.Context) (clientIdentity, error) {
14: return manager.identity, nil
15: }
16:
17: func (*authenticationManager) Start(context.Context, string, protocolCommand, *os.File, *os.File, uint32) error {
18: return nil
19: }
20:
21: func (*authenticationManager) StopAndWait(context.Context, string) error { return nil }
22: func (*authenticationManager) Wait(context.Context, string) (unitResult, error) {
23: return unitResult{}, nil
24: }
25: func (*authenticationManager) CleanupOrphans(context.Context) error { return nil }
26: func (*authenticationManager) Close() {}
27:
28: func currentIdentity() clientIdentity ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/systemd_test.go</path>
<type>file</type>
<content>
1: package supervisor
2:
3: import (
4: "context"
5: "errors"
6: "os"
7: "testing"
8: "time"
9:
10: "github.com/godbus/dbus/v5"
11: )
12:
13: func TestUnitNameGrammar(t *testing.T) {
14: valid := "opencode-pty-0123456789abcdef0123456789abcdef.service"
15: if !validUnitName(valid) {
16: t.Fatalf("rejected %q", valid)
17: }
18: for _, invalid := range []string{
19: "opencode-pty-.service",
20: "opencode-pty-0123456789ABCDEF0123456789ABCDEF.service",
21: "opencode-pty-0123456789abcdef0123456789abcdef.scope",
22: "opencode-pty-0123456789abcdef0123456789abcdef.service/../x",
23: } {
24: if validUnitName(invalid) {
25: t.Fatalf("accepted %q", invalid)
26: }
27: }
28: }
29:
30: func TestWaitForUnitSignalRejectsClosedChannelAndHonorsTimeout(t *testing.T) {
31: closed := make(chan *dbus.Signal)
32: close(closed)
33: if err := ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/internal/supervisor/server_test.go</path>
<type>file</type>
<content>
1: package supervisor
2:
3: import (
4: "bytes"
5: "context"
6: "encoding/binary"
7: "encoding/json"
8: "errors"
9: "fmt"
10: "io"
11: "net"
12: "os"
13: "os/exec"
14: "path/filepath"
15: "sync"
16: "syscall"
17: "testing"
18: "time"
19:
20: "opencode-pty-supervisor/internal/protocol"
21:
22: "golang.org/x/sys/unix"
23: )
24:
25: type sessionManager struct {
26: startErr error
27: wait chan unitResult
28: stop func() error
29: stopped chan struct{}
30: once sync.Once
31: }
32:
33: func (*sessionManager) ClientState(context.Context) (clientIdentity, error) {
34: return currentIdentity(), nil
35: }
36:
37: func (manager *sessionManager) Start(context.Context, string, protocolCommand, *os.File, *os.File, uint32) error {
38: return manager.startErr
39: }
40:
41: func (manager *sessionManager) ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/internal/protocol/frame_test.go</path>
<type>file</type>
<content>
1: package protocol
2:
3: import (
4: "bytes"
5: "errors"
6: "strings"
7: "testing"
8: )
9:
10: func TestStartRoundTrip(t *testing.T) {
11: want := Start{Device: 12, Inode: 34, RuntimeSec: 60, Command: "printf", Args: []string{"%s", "hello world"}}
12: payload, err := EncodeStart(want)
13: if err != nil {
14: t.Fatal(err)
15: }
16: got, err := DecodeStart(payload)
17: if err != nil {
18: t.Fatal(err)
19: }
20: if got.Device != want.Device || got.Inode != want.Inode || got.RuntimeSec != want.RuntimeSec || got.Command != want.Command || strings.Join(got.Args, "\x00") != strings.Join(want.Args, "\x00") {
21: t.Fatalf("got %#v, want %#v", got, want)
22: }
23: }
24:
25: func TestFrameRoundTrip(t *testing.T) {
26: var buffer bytes.Buffer
27: want := Frame{Type: TypeInput, Payload: []byte("hello")}
28: if err := WriteFrame(&buffer, want); err ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/client/main_test.go</path>
<type>file</type>
<content>
1: package main
2:
3: import (
4: "bytes"
5: "encoding/base64"
6: "encoding/json"
7: "fmt"
8: "net"
9: "os"
10: "os/exec"
11: "path/filepath"
12: "strings"
13: "testing"
14:
15: "opencode-pty-supervisor/internal/protocol"
16:
17: "golang.org/x/sys/unix"
18: )
19:
20: func TestNodePassesConnectedSocketWithoutChangingPeerMainPID(t *testing.T) {
21: if os.Getenv("OPENCODE_CLIENT_HELPER_TEST") == "1" {
22: encoded := func(value string) string { return "a" + base64.RawURLEncoding.EncodeToString([]byte(value)) }
23: if err := sendStart(socketFD, cwdFD, []string{"60", encoded("/bin/true")}); err != nil {
24: t.Fatal(err)
25: }
26: return
27: }
28: node, err := exec.Command("node", "-p", "process.execPath").Output()
29: if err != nil {
30: t.Skip("node runtime is unavailable")
31: }
32: socketPath := filepath.Join(t.TempDir(), ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/cmd/launcher/main_test.go</path>
<type>file</type>
<content>
1: package main
2:
3: import (
4: "bytes"
5: "encoding/base64"
6: "errors"
7: "os"
8: "os/exec"
9: "strings"
10: "testing"
11: )
12:
13: func TestDecodeArgumentsPreservesEveryArgument(t *testing.T) {
14: encoded := []string{
15: "a" + base64.RawURLEncoding.EncodeToString([]byte("printf")),
16: "a" + base64.RawURLEncoding.EncodeToString([]byte("%s\\n")),
17: "a" + base64.RawURLEncoding.EncodeToString([]byte("a'b; $(id)")),
18: "a",
19: }
20: got, err := decodeArguments(encoded)
21: if err != nil {
22: t.Fatal(err)
23: }
24: want := []string{"printf", "%s\\n", "a'b; $(id)", ""}
25: if strings.Join(got, "\x00") != strings.Join(want, "\x00") {
26: t.Fatalf("got %#v, want %#v", got, want)
27: }
28: }
29:
30: func TestDecodeArgumentsRejectsInvalidGrammar(t *testing.T) {
31: if _, err := decodeArguments([]string{"bad="}); err == nil {
32: ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/opencode-pty-supervisor.service</path> <type>file</type> <content> 1: [Unit] 2: Description=OpenCode PTY supervisor 3: After=dbus.service 4: Requires=dbus.service 5: 6: [Service] 7: Type=exec 8: User=root 9: Group=byk 10: SupplementaryGroups= 11: ExecStart=/usr/local/libexec/opencode-pty-supervisor 12: RuntimeDirectory=opencode-pty 13: RuntimeDirectoryMode=0750 14: RuntimeDirectoryPreserve=no 15: NoNewPrivileges=yes 16: CapabilityBoundingSet= 17: AmbientCapabilities= 18: UMask=0077 19: KillMode=control-group 20: KillSignal=SIGTERM 21: FinalKillSignal=SIGKILL 22: SendSIGKILL=yes 23: TimeoutStopSec=20s 24: OOMPolicy=kill 25: Delegate=no 26: RestrictAddressFamilies=AF_UNIX 27: PrivateTmp=yes 28: PrivateDevices=yes 29: PrivateMounts=yes 30: PrivateNetwork=yes 31: ProtectSystem=strict 32: ProtectHome=yes 33: ProtectKernelTunables=yes 34: ProtectKernelModules=yes 35: ProtectKernelLogs=yes 36: ProtectControlGroups=yes 37: ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/opencode-pty.slice</path> <type>file</type> <content> 1: [Unit] 2: Description=OpenCode isolated PTY sessions 3: Before=slices.target 4: 5: [Slice] 6: CPUAccounting=yes 7: MemoryAccounting=yes 8: TasksAccounting=yes 9: IOAccounting=yes 10: CPUQuota=800% 11: IOWeight=100 12: MemoryHigh=1536M 13: MemoryMax=2G 14: TasksMax=512 (End of file - total 14 lines) </content>
<path>/home/byk/.local/share/opencode-v2-pilot/opencode-v2.service</path> <type>file</type> <content> 1: [Unit] 2: Description=OpenCode V2 Server 3: After=network.target opencode-pty-supervisor.service 4: Requires=opencode-pty-supervisor.service 5: 6: [Service] 7: Type=simple 8: EnvironmentFile=/home/byk/.opencode/env 9: EnvironmentFile=/home/byk/.local/share/opencode-v2-pilot/server.env 10: Environment=OPENCODE_CONFIG_DIR=/home/byk/.local/share/opencode-v2-pilot/config/opencode 11: Environment=OPENCODE_DB=/home/byk/.local/share/opencode-v2-pilot/data/opencode/opencode.db 12: Environment=XDG_DATA_HOME=/home/byk/.local/share/opencode-v2-pilot/data 13: Environment=XDG_CACHE_HOME=/home/byk/.local/share/opencode-v2-pilot/cache 14: Environment=XDG_CONFIG_HOME=/home/byk/.local/share/opencode-v2-pilot/config 15: Environment=XDG_STATE_HOME=/home/byk/.local/share/opencode-v2-pilot/state 16: User=byk 17: WorkingDirectory=/home/byk 18: ExecCondition=/bin/sh -c 'test -f ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/PROTOCOL.md</path> <type>file</type> <content> 1: # PTY supervisor protocol 2: 3: The protocol uses one Unix `SOCK_STREAM` connection for one PTY. The Node SEA process opens and retains the connection. The supervisor authenticates that connection's immutable peer credentials against the exact `opencode-v2.service` MainPID. The client helper never opens the socket. Node starts the fixed root-owned helper with duplicates of the connected socket at fd 3 and the approved directory at fd 4. The helper sends the start frame and fd 4, then exits. All other Node child processes inherit neither descriptor. 4: 5: Every frame has a 12-byte header: 6: 7: - bytes 0–3: ASCII `OPTY` 8: - byte 4: version `1` 9: - byte 5: type 10: - bytes 6–7: zero 11: - bytes 8–11: unsigned big-endian payload length 12: 13: The largest frame payload is 71,680 bytes. Input and output payloads never exceed 32,768 bytes. ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/ROOT-ACCEPTANCE.md</path> <type>file</type> <content> 1: # Root-only acceptance 2: 3: Do not install, start, enable, or mark the candidate ready until every check below passes on the exact target host. Source tests never substitute for these checks. 4: 5: 1. Rebuild all three binaries reproducibly from the reviewed source. Record the source revision, Go version, dependency sums, build commands, and SHA-256 hashes. Install only those hashes in the root-controlled path: 6: 7: ```sh 8: sudo install -d -o root -g root -m 0755 /usr/local/libexec 9: sudo install -o root -g root -m 0755 bin/opencode-pty-supervisor /usr/local/libexec/opencode-pty-supervisor 10: sudo install -o root -g root -m 0755 bin/opencode-pty-launcher /usr/local/libexec/opencode-pty-launcher 11: sudo install -o root -g root -m 0755 bin/opencode-pty-client /usr/local/libexec/opencode-pty-client 12: ``` 13: 14: 2. ...
<path>/home/byk/.local/share/opencode-v2-pilot/CUTOVER.md</path> <type>file</type> <content> 1: # OpenCode V2 cutover 2: 3: The V2 executable serves the API and web UI from one origin. Do not add nginx. 4: 5: ## Preflight 6: 7: 1. Confirm production is still healthy on port 4096. 8: 2. Confirm the candidate revision and smoke build: 9: `git -C /home/byk/Code/opencode-v2-pilot rev-parse HEAD` 10: `/home/byk/Code/opencode-v2-pilot/packages/cli/dist-v2-pilot-final/cli-node-linux-x64/bin/opencode2-node --version` 11: 3. Confirm the isolated candidate on port 14102: 12: `curl --fail --user opencode:$OPENCODE_PASSWORD http://127.0.0.1:14102/api/health` 13: `curl --fail http://127.0.0.1:14102/ >/dev/null` 14: 4. Confirm both local plugins are active after calling `POST /api/plugin/await-activation`. 15: 5. Create `/home/byk/.local/share/opencode-v2-pilot/server.env` with mode `0600` and one line: `OPENCODE_PASSWORD=<password>`. 16: 6. ...
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/go.mod</path> <type>file</type> <content> 1: module opencode-pty-supervisor 2: 3: go 1.22 4: 5: require ( 6: github.com/coreos/go-systemd/v22 v22.5.0 7: github.com/godbus/dbus/v5 v5.1.0 8: golang.org/x/sys v0.20.0 9: ) (End of file - total 9 lines) </content>
<path>/home/byk/.local/share/opencode-v2-pilot/supervisor/go.sum</path> <type>file</type> <content> 1: github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= 2: github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 3: github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 4: github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= 5: github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 6: golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= 7: golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= (End of file - total 7 lines) </content>
The design now has the intended root boundary: only the service MainPID can establish the socket, the helper receives that connected descriptor instead of dialing, cwd travels as an open directory fd, and transient units remove supplementary groups and capabilities. I am checking whether those claims remain true under restart races, descriptor delegation, systemd job ambiguity, and output backpressure rather than treating the happy-path tests as proof.
/home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/effect/src/NonEmptyIterable.ts /home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/bun-pty/rust-pty/target/release/librust_pty.so /home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/bun-pty/rust-pty/target/release/librust_pty_musl.so /home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/bun-pty/rust-pty/target/release/librust_pty_arm64.so /home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/bun-pty/rust-pty/target/release/librust_pty_arm64_musl.so /home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/bun-pty/rust-pty/target/release/librust_pty.dylib /home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/bun-pty/rust-pty/target/release/librust_pty_arm64.dylib /home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/bun-pty/rust-pty/target/release/rust_pty.dll /home/byk/.local/share/opencode-v2-pilot/config/...
<path>/home/byk/.local/share/opencode-v2-pilot/config/opencode</path> <type>directory</type> <entries> bun.lock node_modules/ opencode.json package.json plugins/ service-v2-pilot.json test/ tsconfig.json (8 entries) </entries>
<path>/home/byk/.local/share/opencode-v2-pilot/config/opencode/package.json</path>
<type>file</type>
<content>
1: {
2: "private": true,
3: "type": "module",
4: "dependencies": {
5: "effect": "4.0.0-rc.112"
6: },
7: "devDependencies": {
8: "@types/bun": "1.2.21"
9: }
10: }
(End of file - total 10 lines)
</content>
<path>/home/byk/.local/share/opencode-v2-pilot/config/opencode/tsconfig.json</path>
<type>file</type>
<content>
1: {
2: "compilerOptions": {
3: "allowImportingTsExtensions": true,
4: "lib": ["ESNext", "DOM", "DOM.Iterable"],
5: "module": "Preserve",
6: "moduleResolution": "Bundler",
7: "noEmit": true,
8: "paths": {
9: "@opencode/plugin": ["/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/index.ts"],
10: "@opencode/plugin/*": ["/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/*.ts"]
11: },
12: "skipLibCheck": true,
13: "strict": true,
14: "target": "ESNext",
15: "types": ["bun"]
16: },
17: "include": ["plugins/**/*.ts", "test/**/*.ts"]
18: }
(End of file - total 18 lines)
</content>
/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/subscription_test.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/subscription_set_test.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/subscription_set.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/subscription.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/set_test.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/set.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/properties.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/methods_test.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/methods.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/dbus_test.go /home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/dbus.go
Found 10 matches
/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/properties.go:
Line 57: func PropExecStart(command []string, uncleanIsFailure bool) Property {
Line 83: func PropType(t string) Property {
Line 138: func PropBindsTo(units ...string) Property {
Line 186: func PropAfter(units ...string) Property {
Line 222: func PropSlice(slice string) Property {
/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/methods.go:
Line 122: func (c *Conn) StopUnitContext(ctx context.Context, name string, mode string, ch chan<- string) (int, error) {
Line 191: func (c *Conn) StartTransientUnitContext(ctx context.Context, name string, mode string, properties []Property, ch chan<- string) (int, error) {
Line 272: func (c *Conn) GetUnitPropertiesContext(ctx context.Context, unit string) (map[string]interface{}, error) {
Line 347: func (c *Conn) GetUnitTypePropertiesContext(ctx context.Context, unit string, unitType string) ...
<path>/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/properties.go</path>
<type>file</type>
<content>
45: }
46:
47: type execStart struct {
48: Path string // the binary path to execute
49: Args []string // an array with all arguments to pass to the executed command, starting with argument 0
50: UncleanIsFailure bool // a boolean whether it should be considered a failure if the process exits uncleanly
51: }
52:
53: // PropExecStart sets the ExecStart service property. The first argument is a
54: // slice with the binary path to execute followed by the arguments to pass to
55: // the executed command. See
56: // http://www.freedesktop.org/software/systemd/man/systemd.service.html#ExecStart=
57: func PropExecStart(command []string, uncleanIsFailure bool) Property {
58: execStarts := []execStart{
59: {
60: Path: command[0],
61: Args: command,
62: UncleanIsFailure: uncleanIsFailure,
63: },
64: ...
<path>/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/methods.go</path>
<type>file</type>
<content>
100: // job timeout was reached. failed indicates that the job failed. dependency
101: // indicates that a job this job has been depending on failed and the job hence
102: // has been removed too. skipped indicates that a job was skipped because it
103: // didn't apply to the units current state.
104: //
105: // If no error occurs, the ID of the underlying systemd job will be returned. There
106: // does exist the possibility for no error to be returned, but for the returned job
107: // ID to be 0. In this case, the actual underlying ID is not 0 and this datapoint
108: // should not be considered authoritative.
109: //
110: // If an error does occur, it will be returned to the user alongside a job ID of 0.
111: func (c *Conn) StartUnitContext(ctx context.Context, name string, mode string, ch chan<- string) (int, error) {
112: return c.startJob(ctx, ch, ...
Found 21 matches
/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/properties.go:
Line 23: // The properties array of StartTransientUnit() may take many of the settings
/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/methods_test.go:
Line 110: _, err := conn.StartTransientUnit(trTarget.name, "replace", trTarget.props, reschan)
Line 1377: _, err = conn.StartTransientUnit(target, "replace", props, reschan)
Line 1532: jobSize := len(conn.jobListener.jobs)
Line 1549: currentJobSize := len(conn.jobListener.jobs)
/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/methods.go:
Line 45: c.jobListener.Lock()
Line 46: out, ok := c.jobListener.jobs[job]
Line 49: delete(c.jobListener.jobs, job)
Line 51: c.jobListener.Unlock()
Line 54: func (c *Conn) startJob(ctx context.Context, ch chan<- string, job string, args ...interface{}) (int, error) {
Line 56: c.jobListener.Lock()
Line 57: defer ...
<path>/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/methods.go</path> <type>file</type> <content> 1: // Copyright 2015, 2018 CoreOS, Inc. 2: // 3: // Licensed under the Apache License, Version 2.0 (the "License"); 4: // you may not use this file except in compliance with the License. 5: // You may obtain a copy of the License at 6: // 7: // http://www.apache.org/licenses/LICENSE-2.0 8: // 9: // Unless required by applicable law or agreed to in writing, software 10: // distributed under the License is distributed on an "AS IS" BASIS, 11: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12: // See the License for the specific language governing permissions and 13: // limitations under the License. 14: 15: package dbus 16: 17: import ( 18: "context" 19: "errors" 20: "fmt" 21: "path" 22: "strconv" 23: 24: "github.com/godbus/dbus/v5" 25: ) 26: 27: // Who can be used to specify which process to kill in the unit via the ...
Found 100 matches (more matches available) /usr/share/dbus-1/system.d/bluetooth.conf: Line 12: <allow send_destination="org.bluez"/> Line 13: <allow send_interface="org.bluez.AdvertisementMonitor1"/> Line 14: <allow send_interface="org.bluez.Agent1"/> Line 15: <allow send_interface="org.bluez.MediaEndpoint1"/> Line 16: <allow send_interface="org.bluez.MediaPlayer1"/> Line 17: <allow send_interface="org.bluez.Profile1"/> Line 18: <allow send_interface="org.bluez.GattCharacteristic1"/> Line 19: <allow send_interface="org.bluez.GattDescriptor1"/> Line 20: <allow send_interface="org.bluez.LEAdvertisement1"/> Line 21: <allow send_interface="org.freedesktop.DBus.ObjectManager"/> Line 22: <allow send_interface="org.freedesktop.DBus.Properties"/> Line 23: <allow send_interface="org.mpris.MediaPlayer2.Player"/> Line 28: <allow send_destination="org.bluez"/> Line 32: <allow ...
<path>/usr/share/dbus-1/system.conf</path> <type>file</type> <content> 1: <!-- This configuration file controls the systemwide message bus. 2: Add a system-local.conf and edit that rather than changing this 3: file directly. --> 4: 5: <!-- Note that there are any number of ways you can hose yourself 6: security-wise by screwing up this file; in particular, you 7: probably don't want to listen on any more addresses, add any more 8: auth mechanisms, run as a different user, etc. --> 9: 10: <!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN" 11: "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> 12: <busconfig> 13: 14: <!-- Our well-known bus type, do not change this --> 15: <type>system</type> 16: 17: <!-- Run as special user --> 18: <user>messagebus</user> 19: 20: <!-- Fork into daemon mode --> 21: <fork/> 22: 23: <!-- We use system service launching using a helper --> 24: ...
<path>/home/byk/go/pkg/mod/github.com/coreos/go-systemd/v22@v22.5.0/dbus/methods.go</path>
<type>file</type>
<content>
260: }
261:
262: return out, nil
263: }
264:
265: // Deprecated: use GetUnitPropertiesContext instead.
266: func (c *Conn) GetUnitProperties(unit string) (map[string]interface{}, error) {
267: return c.GetUnitPropertiesContext(context.Background(), unit)
268: }
269:
270: // GetUnitPropertiesContext takes the (unescaped) unit name and returns all of
271: // its dbus object properties.
272: func (c *Conn) GetUnitPropertiesContext(ctx context.Context, unit string) (map[string]interface{}, error) {
273: path := unitPath(unit)
274: return c.getProperties(ctx, path, "org.freedesktop.systemd1.Unit")
275: }
276:
277: // Deprecated: use GetUnitPathPropertiesContext instead.
278: func (c *Conn) GetUnitPathProperties(path dbus.ObjectPath) (map[string]interface{}, error) {
279: return c.GetUnitPathPropertiesContext(context.Background(), path)
280: }
281:
282: // ...
systemd 255 (255.4-1ubuntu8.17) +PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified Linux labs 6.8.0-117-generic #117-Ubuntu SMP PREEMPT_DYNAMIC Tue May 5 19:26:24 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux opencode-pty-supervisor.service: Command /usr/local/libexec/opencode-pty-supervisor is not executable: No such file or directory
/usr/local/libexec|ABSENT /usr/local/libexec/opencode-pty-supervisor|ABSENT /usr/local/libexec/opencode-pty-launcher|ABSENT /usr/local/libexec/opencode-pty-client|ABSENT /etc/opencode/pty-supervisor-verified|ABSENT
2ac698d65aa4690a694307e9cbdf44537ea9a4fb M packages/core/src/plugin/host.ts M packages/core/test/plugin.test.ts M packages/core/test/plugin/fixture.ts M packages/core/test/plugin/host.ts M packages/plugin/src/effect/permission.ts M packages/plugin/src/promise/adapter.ts M packages/plugin/src/promise/permission.ts ?? packages/cli/dist-v2-pilot-final/ ?? packages/cli/dist-v2-pilot-next/ ?? packages/cli/dist-v2-pilot/ /home|mode=755|uid=0|gid=0|type=directory /home/byk|mode=751|uid=1000|gid=1000|type=directory /home/byk/.local|mode=775|uid=1000|gid=1000|type=directory /home/byk/.local/share|mode=775|uid=1000|gid=1000|type=directory /home/byk/.local/share/opencode-v2-pilot|mode=755|uid=1000|gid=1000|type=directory /home/byk/.local/share/opencode-v2-pilot/supervisor|mode=755|uid=1000|gid=1000|type=directory /home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins|mode=755|uid=1000|gid=1000|type=directory /home/byk/.local/share/opencode-v2-pilot/opencode-v2.service|mode=644|ui...
<path>/proc/sys/kernel/yama/ptrace_scope</path> <type>file</type> <content> 1: 1 (End of file - total 1 lines) </content>
MainPID=0 ControlGroup= User= Group= SupplementaryGroups= InaccessiblePaths= NoNewPrivileges=no SystemCallFilter=~ ProtectProc=default ProcSubset=all LoadState=not-found ActiveState=inactive SubState=dead FragmentPath= InvocationID= MainPID=0 ControlGroup= LoadState=not-found ActiveState=inactive SubState=dead FragmentPath= InvocationID=
/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Mount.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Service.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Socket.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Automount.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Path.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Manager.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Unit.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Device.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Slice.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Scope.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Target.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Timer.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Swap.xml /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Job.xml
Found 63 matches /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Mount.xml: Line 302: <property name="InvocationID" type="ay" access="read"> Line 425: <property name="ControlGroup" type="s" access="read"> Line 428: <property name="ControlGroupId" type="t" access="read"> Line 888: <property name="StandardInputFileDescriptorName" type="s" access="read"> Line 897: <property name="StandardOutputFileDescriptorName" type="s" access="read"> Line 903: <property name="StandardErrorFileDescriptorName" type="s" access="read"> Line 996: <property name="SupplementaryGroups" type="as" access="read"> Line 1041: <property name="ProtectControlGroups" type="b" access="read"> Line 1086: <property name="SystemCallFilter" type="(bas)" access="read"> Line 1104: <property name="RestrictAddressFamilies" type="(bas)" access="read"> /usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Device.xml: Line 302: <property name="InvocationID" type="ay" ...
<path>/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Manager.xml</path> <type>file</type> <content> 440: <arg type="s" name="name" direction="in"/> 441: <arg type="s" name="mode" direction="in"/> 442: <arg type="o" name="job" direction="out"/> 443: </method> 444: <method name="StartUnitWithFlags"> 445: <arg type="s" name="name" direction="in"/> 446: <arg type="s" name="mode" direction="in"/> 447: <arg type="t" name="flags" direction="in"/> 448: <arg type="o" name="job" direction="out"/> 449: </method> 450: <method name="StartUnitReplace"> 451: <arg type="s" name="old_unit" direction="in"/> 452: <arg type="s" name="new_unit" direction="in"/> 453: <arg type="s" name="mode" direction="in"/> 454: <arg type="o" name="job" direction="out"/> 455: </method> 456: <method name="StopUnit"> 457: <arg type="s" name="name" direction="in"/> 458: <arg type="s" name="mode" direction="in"/> 459: <arg type="o" name="job" direction="out"/> 460: ...
<path>/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Unit.xml</path> <type>file</type> <content> 286: </property> 287: <property name="FailureAction" type="s" access="read"> 288: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 289: </property> 290: <property name="FailureActionExitStatus" type="i" access="read"> 291: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 292: </property> 293: <property name="SuccessAction" type="s" access="read"> 294: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 295: </property> 296: <property name="SuccessActionExitStatus" type="i" access="read"> 297: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 298: </property> 299: <property name="RebootArgument" type="s" access="read"> 300: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 301: ...
<path>/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Service.xml</path> <type>file</type> <content> 440: <property name="RemainAfterExit" type="b" access="read"> 441: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 442: </property> 443: <property name="GuessMainPID" type="b" access="read"> 444: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 445: </property> 446: <property name="RestartPreventExitStatus" type="(aiai)" access="read"> 447: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 448: </property> 449: <property name="RestartForceExitStatus" type="(aiai)" access="read"> 450: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 451: </property> 452: <property name="SuccessExitStatus" type="(aiai)" access="read"> 453: <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> 454: ...
Found 5 matches
/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/plugin.ts:
Line 25: export interface Context {
Line 40: readonly permission: PermissionDomain
/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/adapter.ts:
Line 434: permission: {
Line 439: host.permission.assert(input).pipe(
Line 471: host.tool.transform((editor) =>
<path>/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/plugin.ts</path>
<type>file</type>
<content>
1: import type { OpenCodeClient } from "@opencode/client"
2: import type { GenerateApi, PluginApi } from "@opencode/client/promise/api"
3: import type { Location } from "@opencode/schema/location"
4: import type { PluginOptions } from "../options.js"
5: import type { App } from "../app.js"
6: import type { AgentDomain } from "./agent.js"
7: import type { AISDKDomain } from "./aisdk.js"
8: import type { CatalogDomain } from "./catalog.js"
9: import type { CommandDomain } from "./command.js"
10: import type { EventDomain } from "./event.js"
11: import type { IntegrationDomain } from "./integration.js"
12: import type { MCPDomain } from "./mcp.js"
13: import type { PermissionDomain } from "./permission.js"
14: import type { ReferenceDomain } from "./reference.js"
15: import type { RpcDomain } from "./rpc.js"
16: import type { SessionDomain } from "./session.js"
17: import type ...
<path>/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/permission.ts</path>
<type>file</type>
<content>
1: import type { PermissionApi } from "@opencode/client/promise/api"
2: import type { Agent } from "@opencode/schema/agent"
3: import type { Permission } from "@opencode/schema/permission"
4: import type { Session } from "@opencode/schema/session"
5: import type { Hooks } from "./registration.js"
6:
7: export interface PermissionEvaluation {
8: readonly sessionID: Session.ID
9: readonly agent?: Agent.ID
10: readonly action: string
11: readonly resources: ReadonlyArray<string>
12: readonly metadata?: Record<string, unknown>
13: readonly source?: Permission.Source
14: effect: Permission.Effect
15: message?: string
16: }
17:
18: export interface PermissionHooks {
19: readonly evaluate: PermissionEvaluation
20: }
21:
22: export interface PermissionAssertInput {
23: readonly sessionID: Session.ID
24: readonly action: string
25: readonly resources: ...
<path>/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/adapter.ts</path>
<type>file</type>
<content>
420: }),
421: ),
422: ),
423: reload: () => run(host.integration.reload()),
424: connection: {
425: active: (id) => Effect.runPromiseWith(context)(host.integration.connection.active(id)),
426: resolve: (connection) => Effect.runPromiseWith(context)(host.integration.connection.resolve(connection)),
427: },
428: },
429: mcp: {
430: list: adaptApiMethod(McpEndpoints["mcp.list"], host.mcp.list),
431: transform: transform(host.mcp),
432: reload: () => run(host.mcp.reload()),
433: },
434: permission: {
435: hook: (name, callback) =>
436: register(host.permission.hook(name, (event) => Effect.promise(() => Promise.resolve(callback(event))))),
437: assert: ...
Found 100 matches (more matches available)
/home/byk/Code/opencode-v2-pilot/packages/core/src/plugin/vcs/git.ts:
Line 301: return { ...candidate, source: "reflog" } satisfies Base
Line 308: return { name: root.name, ref: candidate.ref, source: "default" } satisfies Base
/home/byk/Code/opencode-v2-pilot/packages/core/src/plugin/supervisor.ts:
Line 6: import { ConfigPluginSource } from "../config/plugin/source.js"
Line 73: source: pluginSource(operation.target),
Line 107: source: plugin.source ?? { type: "builtin" as const },
Line 121: const sources = yield* ConfigPluginSource.Service
Line 144: ...internal.pre.map((plugin) => ({ ...plugin, revision: "internal", source: { type: "builtin" as const } })),
Line 151: source: { type: "builtin" as const },
Line 153: const operations = yield* sources.operations()
Line 156: const source = (source: Plugin.Source) =>
Line 157: source.type === ...
<path>/home/byk/Code/opencode-v2-pilot/packages/core/src/plugin/host.ts</path>
<type>file</type>
<content>
350: },
351: })
352: }),
353: },
354: mcp: {
355: list: (input) => {
356: const ref = locationRef(input)
357: if (ref && !isCurrentLocation(ref))
358: return Effect.gen(function* () {
359: const location = yield* Location.Service
360: const mcp = yield* Mcp.Service
361: return {
362: location: new Location.Info({
363: directory: location.directory,
364: workspaceID: location.workspaceID,
365: project: location.project,
366: }),
367: data: yield* mcp.servers(),
368: }
369: }).pipe(Effect.provide(locations.get(ref)))
370: return response(mcp.servers())
371: },
372: reload: mcp.reload,
373: transform: (callback) =>
374: ...
Found 2 matches
/home/byk/Code/opencode-v2-pilot/packages/core/src/permission.ts:
Line 105: readonly assert: (input: AssertInput) => Effect.Effect<void, Error | SessionErrors.NotFoundError>
Line 221: const assert = Effect.fn("Permission.assert")((input: AssertInput) =>
<path>/home/byk/Code/opencode-v2-pilot/packages/core/src/permission.ts</path>
<type>file</type>
<content>
80:
81: export class NotFoundError extends Schema.TaggedError<NotFoundError>()("Permission.NotFoundError", {
82: requestID: ID,
83: }) {}
84:
85: export type Error = BlockedError | CorrectedError
86:
87: export function evaluate(action: string, resource: string, ...rulesets: Permission.Ruleset[]): Permission.Rule {
88: return (
89: rulesets
90: .flat()
91: .findLast((rule) => Wildcard.match(action, rule.action) && Wildcard.match(resource, rule.resource)) ?? {
92: action,
93: resource: "*",
94: effect: "ask",
95: }
96: )
97: }
98:
99: export function merge(...rulesets: Permission.Ruleset[]): Permission.Ruleset {
100: return rulesets.flat()
101: }
102:
103: export interface Interface {
104: readonly ask: (input: AssertInput) => Effect.Effect<AskResult, SessionErrors.NotFoundError>
105: readonly assert: (input: AssertInput) => ...
No files found
No files found
/home/byk/.volta/bin/bun /home/byk/.volta/bin/node total 91076 drwxr-xr-x 9 byk byk 4096 Sep 8 06:52 . drwxrwxrwt 88 root root 12288 Sep 8 06:56 .. drwxr-xr-x 3 byk byk 4096 Sep 8 01:05 bun-1.4.2 -rw-r--r-- 1 byk byk 36646985 Sep 8 01:05 bun-linux-x64-1.4.2.zip -rw-r--r-- 1 byk byk 1014 Sep 8 02:08 followup-tsconfig.json drwxr-xr-x 3 byk byk 4096 Sep 8 01:37 opencode-pty-0.3.6 -rw-r--r-- 1 byk byk 189302 Sep 8 01:36 opencode-pty-0.3.6.tgz -rwxr-xr-x 1 byk byk 2109929 Sep 8 06:47 opencode-pty-client-a -rwxr-xr-x 1 byk byk 2109929 Sep 8 06:47 opencode-pty-client-b -rwxr-xr-x 1 byk byk 2109912 Sep 8 06:40 opencode-pty-client-current -rwxr-xr-x 1 byk byk 2109912 Sep 8 06:38 opencode-pty-client-final-a -rwxr-xr-x 1 byk byk 2109912 Sep 8 06:38 opencode-pty-client-final-b -rwxr-xr-x 1 byk byk 2000758 Sep 8 04:47 opencode-pty-launcher -rwxr-xr-x 1 byk byk 2098959 Sep 8 06:47 opencode-pty-launcher-a -rwxr-xr-x 1 ...
No files found
<path>/home/byk/Code/opencode-v2-pilot/node_modules/.bin</path> <type>directory</type> <entries> ast-grep husky oxlint prettier semver sg sst tsc tsgo tsgolint tsserver turbo (12 entries) </entries>
bin/opencode-pty-supervisor: go1.22.2 path opencode-pty-supervisor/cmd/supervisor mod opencode-pty-supervisor (devel) dep github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= dep github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= dep golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= build -buildmode=exe build -compiler=gc build -trimpath=true build CGO_ENABLED=0 build GOARCH=amd64 build GOOS=linux build GOAMD64=v1 bin/opencode-pty-launcher: go1.22.2 path opencode-pty-supervisor/cmd/launcher mod opencode-pty-supervisor (devel) dep golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= build -buildmode=exe build -compiler=gc build -trimpath=true build CGO_ENABLED=0 build GOARCH=amd64 build GOOS=linux build GOAMD64=v1 bin/opencode-pty-client: ...
Two blocking defects are now proven from authoritative host contracts, not hypotheses. ClientState reads ControlGroup from the Unit interface even though systemd 255 exposes it on the Service interface, so every real authentication attempt fails closed; separately, the cleanup signal match accepts any sender, while this host’s system bus policy allows every user to emit signals, so a local user can forge UnitRemoved and make StopAndWait report success before cgroup removal.
[
{
"content": "Inventory exact target files, binaries, metadata, and hashes",
"status": "completed",
"priority": "high"
},
{
"content": "Inspect every supervisor source, test, unit, plugin, transport, and cutover document",
"status": "completed",
"priority": "high"
},
{
"content": "Trace authentication, descriptor inheritance, protocol, lifecycle, and cleanup invariants",
"status": "in_progress",
"priority": "high"
},
{
"content": "Verify systemd interfaces, hardening, containment, resource bounds, and external delegation",
"status": "pending",
"priority": "high"
},
{
"content": "Rebuild all binaries reproducibly and compare hashes",
"status": "pending",
"priority": "high"
},
{
"content": "Run permitted unprivileged tests and offline analyzers",
"status": "pending",
"priority": "high"
},
{
"content": "Produce evidence-based PASS/CONCERN/MUST-FIX verdict",
"status": "pending",
...
? opencode-pty-supervisor/cmd/supervisor [no test files] ok opencode-pty-supervisor/cmd/client 2.229s ok opencode-pty-supervisor/cmd/launcher 2.329s ok opencode-pty-supervisor/internal/protocol 1.029s ok opencode-pty-supervisor/internal/supervisor 3.615s
(no output)
...output truncated...
Full output saved to: /home/byk/.local/share/opencode/tool-output/tool_07fcfcb1900174XGrLVLzHZYAw
Types of property 'encoding' are incompatible.
Type 'readonly [import("/home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/effect/dist/SchemaAST").Link, ...import("/home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/effect/dist/SchemaAST").Link[]] | undefined' is not assignable to type 'readonly [import("/home/byk/Code/opencode-v2-pilot/node_modules/.bun/effect@4.0.0-rc.112/node_modules/effect/dist/SchemaAST").Link, ...import("/home/byk/Code/opencode-v2-pilot/node_modules/.bun/effect@4.0.0-rc.112/node_modules/effect/dist/SchemaAST").Link[]] | undefined'.
Type 'readonly ...
<path>/tmp/opencode/pty-tsconfig.json</path>
<type>file</type>
<content>
1: {
2: "compilerOptions": {
3: "allowImportingTsExtensions": true,
4: "lib": ["ESNext", "DOM", "DOM.Iterable"],
5: "module": "Preserve",
6: "moduleResolution": "Bundler",
7: "noEmit": true,
8: "paths": {
9: "@opencode/plugin": ["/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/index.ts"],
10: "@opencode/plugin/*": ["/home/byk/Code/opencode-v2-pilot/packages/plugin/src/promise/*.ts"],
11: "effect": ["/home/byk/Code/opencode-v2-pilot/node_modules/.bun/effect@4.0.0-rc.112/node_modules/effect/dist/index.d.ts"],
12: "effect/*": ["/home/byk/Code/opencode-v2-pilot/node_modules/.bun/effect@4.0.0-rc.112/node_modules/effect/dist/*.d.ts"]
13: },
14: "skipLibCheck": true,
15: "strict": true,
16: "target": "ESNext",
17: "typeRoots": [
18: "/home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/@types",
19: ...
(no output)
(no output)
(no output)
b8f1914dfea234ec86c74cc9d4c087c3b6db4a8f333d1f1d2624238745db366a /tmp/opencode/pty-review-fresh-a/opencode-pty-supervisor b8f1914dfea234ec86c74cc9d4c087c3b6db4a8f333d1f1d2624238745db366a /tmp/opencode/pty-review-fresh-b/opencode-pty-supervisor c5c09ece21c802868721dfc3e2610496ad9630c1b3a4c258104bc92b2bd9aca1 bin/opencode-pty-supervisor d4f483d2f5824137da5a11c798f4ef7b2b13261954236488eaf6fa4d290d8d0c /tmp/opencode/pty-review-fresh-a/opencode-pty-launcher d4f483d2f5824137da5a11c798f4ef7b2b13261954236488eaf6fa4d290d8d0c /tmp/opencode/pty-review-fresh-b/opencode-pty-launcher d833c859476f021565e8f425e6ee51353909060fa5f64ce629fb07d3411987dd bin/opencode-pty-launcher b6cd329200d5dae973f6a53a486d0ae90e938ee26703ed39c2f11eebf385ace3 /tmp/opencode/pty-review-fresh-a/opencode-pty-client b6cd329200d5dae973f6a53a486d0ae90e938ee26703ed39c2f11eebf385ace3 /tmp/opencode/pty-review-fresh-b/opencode-pty-client fb8739d98ff7882782005e04ef731b6120e8daf0719e606362a1fe620adc2cde ...
The checked-in binaries do not match two deterministic fresh builds using the recorded CGO_ENABLED=0 go build -trimpath settings. Their metadata omits a Go build ID, so I am testing the likely missing -ldflags=-buildid= invocation before classifying this as stale binaries rather than an undocumented build command.
Your previous result was empty. Resume the same READ-ONLY security review against the unchanged exact source and artifacts. You must return substantive current file:line findings or name the exact tool/error blocking review. Cover every requested supervisor, plugin, unit, cutover, test, protocol, and binary artifact; verify the exact hashes and relevant pinned APIs. Classify PASS/CONCERN/MUST-FIX. Do not edit files, install/start services, or perform privileged operations. End exactly MERGE or DO-NOT-MERGE.
I am resuming against the same frozen hashes. The fresh builds are reproducible and match the supplied binaries only when -trimpath is combined with CGO_ENABLED=0 and -ldflags=-buildid=; I will distinguish that artifact success from the source and containment defects that still block deployment.
NotFound: FileSystem.access (/home/byk/.local/share/opencode-v2-pilot/supervisor booking)
Found 4 matches
/home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty-transport.ts:
Line 155: return spawn(options.helperPath ?? DEFAULT_HELPER_PATH, [
Line 243: const socket = createConnection(path)
/home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty.ts:
Line 269: return result(JSON.stringify({ type: "pty.spawn", session: info(session) }))
Line 595: const grep = spawn("/usr/bin/grep", ["-a", "-m", String(limit), "-nE", ...(ignoreCase ? ["-i"] : []), "--", pattern])
Found 3 matches
/home/byk/go/pkg/mod/github.com/godbus/dbus/v5@v5.1.0/default_handler.go:
Line 322: case scd.ch <- signal:
Line 333: case scd.ch <- signal:
/home/byk/go/pkg/mod/github.com/godbus/dbus/v5@v5.1.0/conn.go:
Line 667: func (conn *Conn) Signal(ch chan<- *Signal) {
<path>/home/byk/go/pkg/mod/github.com/godbus/dbus/v5@v5.1.0/default_handler.go</path>
<type>file</type>
<content>
290: return
291: }
292: sh.signals = append(sh.signals, &signalChannelData{
293: ch: ch,
294: done: make(chan struct{}),
295: })
296: }
297:
298: func (sh *defaultSignalHandler) RemoveSignal(ch chan<- *Signal) {
299: sh.mu.Lock()
300: defer sh.mu.Unlock()
301: if sh.closed {
302: return
303: }
304: for i := len(sh.signals) - 1; i >= 0; i-- {
305: if ch == sh.signals[i].ch {
306: sh.signals[i].close()
307: copy(sh.signals[i:], sh.signals[i+1:])
308: sh.signals[len(sh.signals)-1] = nil
309: sh.signals = sh.signals[:len(sh.signals)-1]
310: }
311: }
312: }
313:
314: type signalChannelData struct {
315: wg sync.WaitGroup
316: ch chan<- *Signal
317: done chan struct{}
318: }
319:
320: func (scd *signalChannelData) deliver(signal *Signal) {
321: select {
322: case scd.ch <- signal:
323: case <-scd.done:
324: return
325: ...
<path>/home/byk/.local/share/opencode/tool-output/tool_07fcfcb1900174XGrLVLzHZYAw</path>
<type>file</type>
<content>
1: plugins/followup.ts(52,12): error TS2322: Type 'Struct<{ readonly delay: String; readonly message: String; }>' is not assignable to type 'ValueSchema<any>'.
2: Type 'Struct<{ readonly delay: String; readonly message: String; }>' is not assignable to type 'Codec<any, any, never, never>'.
3: Types of property '"ast"' are incompatible.
4: Type 'Objects' is not assignable to type 'AST'.
5: Type 'import("/home/byk/.local/share/opencode-v2-pilot/config/opencode/node_modules/effect/dist/SchemaAST").Objects' is not assignable to type 'import("/home/byk/Code/opencode-v2-pilot/node_modules/.bun/effect@4.0.0-rc.112/node_modules/effect/dist/SchemaAST").Objects'.
6: Types of property 'propertySignatures' are incompatible.
7: Type 'readonly ...
9f70a745367e68d0f35aa14cb5048b8c83652cf10e279539ab16f25037757f1a ROOT-ACCEPTANCE.md 2a588cef62538063cbe7f3dbc27305a7e8e2511a59a86c6cec6b5b18b1b2275f PROTOCOL.md d1d088bdd65f99056657717658d3336ae233acd2ad39fa998ebe8a773f68348e go.mod dad6a6773121326ee41a6a081cf310444b6fcd3540f28f4b3f31de559d31726b go.sum 5f03c865c17fbb54e2fa3a0e0c7cbf899ad4509228d1a7262aaa4ea3387b9e20 opencode-pty.slice 63414c4afc3e4bad52d4738e9bfd1886a312012663dd4eb7390481cc50636239 opencode-pty-supervisor.service 9471c8c9dd2a8c00274e1e6ecc89983377c3810e2a7ad47b962df19ce6d2995b cmd/client/main.go 506fe06b72e9859bdd101b2c048b63c6b866a290a1ab27311ccaff9bdd23658b cmd/client/main_test.go c5fef296d93af561b99284f9e73bdd9569d8501f92bd34bf47a10ae2fe03f41b cmd/launcher/main.go e584ce5e320bc8c9dc6c250c548bbae517fa6ecdc721a5813cd6bb148fc3b090 cmd/launcher/main_test.go d7381fa5feeacacbf94cddbf36539f8544ccab9705fa4b7906207726d67c387d cmd/supervisor/main.go 83ef89be747e6c1bd51ba1474307980dd4e9d4c1d17360be1c02538c990f832d ...
recv(2) - Linux manual page
man7.org > Linux > man-pages
Linux/UNIX system programming training
recv(2) — Linux manual page
NAME | LIBRARY | SYNOPSIS | DESCRIPTION | RETURN VALUE | ERRORS | VERSIONS | STANDARDS | HISTORY | NOTES | EXAMPLES | SEE ALSO | COLOPHON
recv(2) System Calls Manual recv(2)
NAME top
recv, recvfrom, recvmsg - receive a message from a socket
LIBRARY top
Standard C library (libc, -lc)
SYNOPSIS top
#include <sys/socket.h>
ssize_t recv(size_t size;
...
unix(7) - Linux manual page
man7.org > Linux > man-pages
Linux/UNIX system programming training
unix(7) — Linux manual page
NAME | SYNOPSIS | DESCRIPTION | ERRORS | VERSIONS | NOTES | BUGS | EXAMPLES | SEE ALSO | COLOPHON
UNIX(7) Miscellaneous Information Manual UNIX(7)
NAME top
unix - sockets for local interprocess communication
SYNOPSIS top
#include <sys/socket.h>
#include <sys/un.h>
unix_socket = socket(AF_UNIX, type, 0);
error = socketpair(AF_UNIX, type, 0, int *sv);
DESCRIPTION ...
ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x46dda0 Start of program headers: 64 (bytes into file) Start of section headers: 344 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 5 Size of section headers: 64 (bytes) Number of section headers: 22 Section header string table index: 19 Elf file type is EXEC (Executable ...
c5c09ece21c802868721dfc3e2610496ad9630c1b3a4c258104bc92b2bd9aca1 /tmp/opencode/pty-review-fresh-c/opencode-pty-supervisor d833c859476f021565e8f425e6ee51353909060fa5f64ce629fb07d3411987dd /tmp/opencode/pty-review-fresh-c/opencode-pty-launcher fb8739d98ff7882782005e04ef731b6120e8daf0719e606362a1fe620adc2cde /tmp/opencode/pty-review-fresh-c/opencode-pty-client
[
{
"content": "Inventory exact target files, binaries, metadata, and hashes",
"status": "completed",
"priority": "high"
},
{
"content": "Inspect every supervisor source, test, unit, plugin, transport, and cutover document",
"status": "completed",
"priority": "high"
},
{
"content": "Trace authentication, descriptor inheritance, protocol, lifecycle, and cleanup invariants",
"status": "completed",
"priority": "high"
},
{
"content": "Verify systemd interfaces, hardening, containment, resource bounds, and external delegation",
"status": "completed",
"priority": "high"
},
{
"content": "Rebuild all binaries reproducibly and compare hashes",
"status": "completed",
"priority": "high"
},
{
"content": "Run permitted unprivileged tests and offline analyzers",
"status": "completed",
"priority": "high"
},
{
"content": "Produce evidence-based PASS/CONCERN/MUST-FIX verdict",
"status": ...
Findings
MUST-FIX: real clients can never authenticate because ControlGroup comes from the wrong systemd interface. ClientState obtains Unit and Service property maps at supervisor/internal/supervisor/systemd.go:82-90, but reads ControlGroup from unit at systemd.go:103-106. On systemd 255, Unit exposes InvocationID (/usr/share/dbus-1/interfaces/org.freedesktop.systemd1.Unit.xml:302-305), while Service exposes MainPID and ControlGroup (org.freedesktop.systemd1.Service.xml:455-456,577-581). The resulting missing value fails authentication at auth.go:77-79. Existing tests inject synthetic maps and never exercise the real interface split.
MUST-FIX: any local system-bus user can forge cleanup completion. Signal subscriptions constrain path, interface, member, and unit argument but never sender at systemd.go:278-290. StopAndWait accepts a matching UnitRemoved signal as proof of cleanup at systemd.go:205-215. This host explicitly permits all users to emit signals at /usr/share/dbus-1/system.conf:44-55. A forged signal can therefore return success while the transient cgroup remains alive. This also enables memory exhaustion: godbus creates deferred-delivery goroutines when the eight-entry signal channel fills (github.com/godbus/dbus/v5@v5.1.0/default_handler.go:320-337). Require the systemd sender and validate accepted signals.
MUST-FIX: explicit kill, Session deletion, and plugin shutdown can hang behind blocked PTY input. The supervisor may block writing an input frame to a command that does not read stdin (server.go:337-352). The client’s stop frame uses the same stream, and SupervisorTransport.close() awaits that write without a timeout at pty-transport.ts:197-205. It therefore never reaches its 25-second exit timeout or destroys the socket. terminate() waits for transport.close() before starting its own close timeout (pty.ts:483-502), while deletion and unload await terminate() at ...
* 🔴 (07:07) User established that `struct sockaddr_un.sun_family` always contains `AF_UNIX`; on Linux, `sun_path` is 108 bytes. * 🟡 (07:07) Linux `unix(7)` documentation distinguishes 3 `sockaddr_un` address types: pathname sockets use a null-terminated filesystem path; unnamed sockets return length `sizeof(sa_family_t)` and `sun_path` must not be inspected; abstract sockets have `sun_path[0] =…
* 🟡 (07:06) TypeScript compilation of `plugins/followup.ts` produced at least 664 lines of diagnostics. At `plugins/followup.ts(52,12)`, TS2322 reports `Struct<{ readonly delay: String; readonly message: String; }>` is not assignable to `ValueSchema<any>`; at `plugins/followup.ts(53,13)`, TS2322 reports `String` is not assignable to `ValueSchema<any> | undefined`. * 🟡 (07:06) The `plugins/follo…
* 🟡 (07:03) Review tooling could not access `/home/byk/.local/share/opencode-v2-pilot/supervisor booking`; `FileSystem.access` returned `NotFound`. * 🟡 (07:05) Source search found process/socket operations in `/home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty-transport.ts`: line 155 calls `spawn(options.helperPath ?? DEFAULT_HELPER_PATH, [`, and line 243 calls `createConnecti…
* 🔴 (07:01) [requested-security-review] User asked to resume the READ-ONLY security review against the unchanged exact source and artifacts, requiring substantive current `file:line` findings or the exact blocking tool/error. * 🔴 (07:01) User required the review to cover every requested supervisor, plugin, unit, cutover, test, protocol, and binary artifact; verify exact hashes and relevant pinn…
Date: Sep 8, 2026 * 🔴 (06:58) TypeScript checking of `/home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty.ts` produced `TS2322` errors at `plugins/pty.ts(350,12)`, `plugins/pty.ts(351,13)`, `plugins/pty.ts(363,12)`, and `plugins/pty.ts(364,13)`: schemas such as `Struct<{}>`, `String`, and `Struct<{ readonly id: String; readonly cleanup: optional<Boolean>; }>` were not assignable…
* 🔴 (06:56) `packages/core/src/permission.ts` defines `evaluate(action, resource, ...rulesets)` by flattening rulesets, selecting the last wildcard-matching action/resource rule with `findLast`, and defaulting to `{ action, resource: "*", effect: "ask" }`; `merge(...rulesets)` returns `rulesets.flat()`. * 🔴 (06:56) `packages/core/src/permission.ts` permission state uses `pending: Map<ID, Pendin…
* 🔴 (06:54) User stated repository type-checking must always use `bun typecheck` from a package directory such as `packages/core`; never run `tsc` directly. * 🔴 (06:54) User stated runtime dependencies must flow from Schema to Core and Protocol, then from Core and Protocol to Server. Client runtime code may depend on Schema and Protocol but never Core or Server; `sdk` composes Client, Core, and…
Date: Sep 8, 2026 * 🔴 (06:51) In `github.com/coreos/go-systemd/v22@v22.5.0/dbus/methods.go`, `(*Conn).startJob()` holds `c.jobListener` across the D-Bus method call when a result channel is supplied, stores the returned job object path in `c.jobListener.jobs[p]`, and derives the numeric job ID using `strconv.Atoi(path.Base(string(p)))`; `jobComplete()` routes the systemd job result by object pat…
* 🔴 (06:49) `/home/byk/.local/share/opencode-v2-pilot/opencode-v2.service` defines `Description=OpenCode V2 Server`, orders itself after `network.target` and `opencode-pty-supervisor.service`, requires `opencode-pty-supervisor.service`, and uses `Type=simple`. * 🔴 (06:49) `opencode-v2.service` loads `/home/byk/.opencode/env` and `/home/byk/.local/share/opencode-v2-pilot/server.env`; sets `OPENC…
* 🟡 (06:48) `internal/supervisor/auth_test.go` defines `authenticationManager`, whose `ClientState()` returns a configurable `clientIdentity`; its `Start()`, `StopAndWait()`, `Wait()`, and `CleanupOrphans()` methods succeed without action, and `Close()` is empty. * 🟡 (06:48) `currentIdentity()` in `internal/supervisor/auth_test.go` returns the current process PID with `ActiveState: "active"`, `…
Date: Sep 8, 2026 * 🟡 (06:47) `cmd/launcher/main.go` defines `encodedArgumentsEnvironment = "OPENCODE_PTY_ARGV"` and `launcherFD = 3`. `run(values)` supports an internal exact `--exec` mode; otherwise it validates encoded arguments, changes directory with `syscall.Fchdir(2)`, duplicates stdout fd `1` onto fd `2`, installs a fixed environment, stores encoded argv joined by `"."` in `OPENCODE_PTY_…
Date: Sep 8, 2026 * 🟡 (06:47) `internal/supervisor/systemd.go` constants: `clientService = "opencode-v2.service"`, `supervisorService = "opencode-pty-supervisor.service"`, `ptySlice = "opencode-pty.slice"`, `expectedClientCgroup = "/system.slice/opencode-v2.service"`, `launcherPath = "/usr/local/libexec/opencode-pty-launcher"`, `unitPrefix = "opencode-pty-"`, `unitSuffix = ".service"`, `operatio…
Date: Sep 8, 2026 * 🟢 (06:45) Initial path probes found no `/bots` and no `/home/byk/.local/share/opencode-local`; tool suggested `/home/byk/.local/share/opencode`. * 🟡 (06:46) Review inventory identified 22 files under `/home/byk/.local/share/opencode-v2-pilot/supervisor`: `ROOT-ACCEPTANCE.md`, `PROTOCOL.md`, `go.mod`, `go.sum`, `opencode-pty.slice`, `opencode-pty-supervisor.service`, `cmd/cli…
Date: Sep 8, 2026 * 🔴 [requested-security-review] (06:45) User requested a substantive independent READ-ONLY security review of the exact current files under `/home/byk/.local/share/opencode-v2-pilot/supervisor`, plus `/home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty.ts`, `/home/byk/.local/share/opencode-v2-pilot/config/opencode/plugins/pty-transport.ts`, `/home/byk/.local/sh…