SPB Git

Repository Public

deliverables-status.md 16.9 KB

# Deliverables status

Status of the 17 deliverables as of 2026-11-10 00:05 ET. "Tests" lists what was actually executed and its result. Global test results (laptop, macOS, real tmux, real PostgreSQL, real claude binary, no prompt ever sent): runtime 209 passed · server 175 passed (17 against the real runtime) · web unit 12 passed · Playwright 19 passed against the dev mock (15 Chromium desktop, 4 WebKit iPhone 15 emulation) + 2 passed against the real backend · scripts/ci.sh green.

Path prefixes: R/ = apps/runtime/src/, S/ = apps/server/src/, W/ = apps/web/.

Legend: Done = implemented, tested and (where applicable) verified on production · Done, partly verified = implemented and tested, with a named part not verified · Pending = not demonstrated.

# Deliverable Status
1 Working production web application Done, partly verified
2 Real Claude Code PTY runtime Done, partly verified
3 Secure private authentication Done, partly verified
4 Persistent terminal sessions Done, partly verified
5 Polished desktop interface Done
6 Tested mobile interface Done, partly verified (emulation only)
7 Project management Done, partly verified
8 File browsing and editing Done
9 Skills and MCP management Done, partly verified
10 Authorized MacLustr integration Done, partly verified
11 Background task management Done
12 Real observability Done
13 Deployment configuration Done
14 Backup and recovery procedures Done, partly verified
15 Security documentation Done
16 Automated tests Done
17 Demonstrated laptop-independence test Pending — not yet demonstrated

# 1. Working production web application

  • Status. Deployed 2026-11-10 on M5M36 at https://claude.spboucher.ai (PM2: runtime, server on 8620, nightly backup; PostgreSQL 17 local).
  • Main files. apps/server, apps/runtime, apps/web, packages/shared, deploy/make-manifest.py.
  • Tests / verification. On production after deploy: /api/v1/health 200 locally and publicly (valid TLS, HTTP/2, HTTP→HTTPS 308); 10 API routes + POST + WebSocket upgrade 401 without a session; foreign-Origin POST 403; wrong setup token 401; security headers present.
  • Limitations. No administrator account exists yet and Claude Code is not authenticated on the node, so no authenticated flow has been exercised on production. Single host.
  • Security. Public HTTPS endpoint in front of a shell; see security.md.

# 2. Real Claude Code PTY runtime

  • Status. The real claude CLI runs in tmux; the browser attaches through node-pty. Nothing is simulated.
  • Main files. R/tmux.ts, R/sessions.ts, R/core-attach.ts, R/core-scrollback.ts, R/core-backpressure.ts, R/hooks.ts, apps/runtime/bin/cr-hook, S/modules/terminal-ws.ts, S/ws-pipe.ts, W/src/components/terminal/controller.ts.
  • Tests. R/sessions.test.ts (lifecycle, isolation, limits, "claude smoke: the real CLI starts under tmux and its TUI renders"), R/scrollback.test.ts (13), R/hooks.test.ts (10), R/main.test.ts; S/modules/ws.test.ts (13); S/integration/real-runtime.test.ts ("claude session: the real CLI starts under tmux and produces output"). All passed. On the node: claude 2.1.322 launched through the runtime and rendered its welcome screen.
  • Limitations. No prompt was ever sent (no paid conversation); WAITING_FOR_INPUT not observed from a real conversation; 4429 not observed under real saturation; CLI output formats are those of Claude Code 2.1.x.
  • Security. Permission-bypass flags refused; arguments built server-side only; runtime secrets stripped from session environments; hook token limited to one route.

# 3. Secure private authentication

  • Status. Password (argon2id) + mandatory second factor (TOTP or passkey), one-time setup token, CSRF + Origin checks, throttling, rate limits, session revocation.
  • Main files. S/security/{guard,sessions,password,totp,webauthn,throttle,setup-token,crypto}.ts, S/modules/auth/*, W/src/app/(auth)/*, W/src/components/settings/security.tsx.
  • Tests. S/modules/auth/auth.test.ts (22), webauthn.test.ts (12), S/security/unit.test.ts, S/http.test.ts (route-table audit), S/prod.test.ts (cookie flags), S/rate-limit.test.ts (6); Playwright login, lockout countdown and first-run setup. All passed. Production: refusals and setup-token rejection verified.
  • Limitations. Passkeys verified with a software authenticator only, not in a real browser; no recovery flow; single account.
  • Security. Detailed in authentication.md and security.md.

# 4. Persistent terminal sessions

  • Status. Sessions live in a tmux server that outlives browser, server and runtime; lost tmux ⇒ RECOVERABLE with restart via claude --resume / --continue.
  • Main files. R/tmux.ts, R/auth.ts (hook-token reuse), S/modules/sessions/{service,index}.ts, packages/shared/src/states.ts, W/src/components/terminal/controller.ts.
  • Tests. R/main.test.ts ("SIGKILL of a real runtime process leaves the session running…"); S/integration/real-runtime.test.ts (reattach, runtime down/restart, tmux session killed, tmux server gone ⇒ RECOVERABLE + restart); S/modules/sessions/sessions.test.ts (15); Playwright "network drop" and real-backend reload re-attach. All passed.
  • Limitations. No real reboot of M5M36 was performed; iOS suspension not tested on a device; resume verified as arguments, not as a resumed conversation. Process memory never survives a tmux loss — see session-persistence.md.
  • Security. Re-attach is re-authorised on every connection; a revoked auth session closes its sockets.

# 5. Polished desktop interface

  • Status. Sidebar navigation (10 areas), tabbed terminal workspace, right panel (files, git, host metrics), Monaco editor with conflict dialog and diff, five layout presets, command palette, quick session switcher, notifications, connection indicator with measured latency, persisted layout.
  • Main files. W/src/components/shell/*, components/terminal/{workspace,terminal-view}.tsx, components/editor/*, components/files/*, stores/ui.ts, app/(app)/*.
  • Tests. Playwright project desktop (Chromium 1440×900, mock API): auth-terminal.spec.ts (5), features.spec.ts (8), setup-offline.spec.ts (2) — 15 passed; e2e-real/real-backend.spec.ts — 2 passed against the real server and runtime.
  • Limitations. Chromium only on desktop (no Firefox or desktop Safari run). "Polished" is a judgement; what is verified is function, absence of console errors and of CSP violations on every route. A theme change was in progress in the working tree (uncommitted, not deployed) when this was written and is not described.
  • Security. No third-party origin; CSRF token in memory only; Markdown preview without raw HTML.

# 6. Tested mobile interface

  • Status. Phone shell, key toolbar with sticky modifiers, touch gestures, PWA shell — tested in emulation.
  • Main files. W/src/components/shell/mobile-shell.tsx, components/terminal/{mobile-terminal,mobile-toolbar,keys,touch}.ts(x), hooks/use-viewport.ts, W/public/{sw.js,manifest.webmanifest}.
  • Tests. Playwright project mobile (WebKit, iPhone 15 profile, mock API): mobile.spec.ts — 4 passed; W/src/__tests__/keys.test.ts.
  • Limitations. Not tested on a real iPhone, in Safari, or as an installed PWA. No Web Push. See mobile-experience.md.
  • Security. The service worker never handles or caches /api/*.

# 7. Project management

  • Status. Projects are registered directories under a workspace root: create, register existing, clone; rename, tags, pin; unregister never deletes files.
  • Main files. S/modules/projects/index.ts, R/git.ts (clone), W/src/app/(app)/projects/page.tsx.
  • Tests. S/modules/projects/projects-files-tasks.test.ts (17); real-runtime.test.ts ("creates a project directory (mode create)"); R/git.test.ts (13, including clone URL validation). All passed.
  • Limitations. Clone mode not tested against the real git server from the application (git clone with the node key works by hand).
  • Security. Clone URL whitelist (no option-like strings, no file:///ext::), GIT_TERMINAL_PROMPT=0, credentials stripped from stored remotes.

# 8. File browsing and editing

  • Status. List, read, write with optimistic concurrency (sha256), mkdir / rename / delete, streamed upload and download, name and content search, git status and diff; editor with Markdown, image and PDF previews.
  • Main files. R/paths.ts, R/fs.ts, R/fsx-transfer.ts, R/fsx-search.ts, R/git.ts, S/modules/files/index.ts, W/src/components/{files,editor}/*.
  • Tests. R/paths.test.ts (29), R/fs.test.ts (22), R/git.test.ts; real-runtime.test.ts ("files: write / read / conflict (409 + details) / mkdir / rename / upload (+overwrite) / download / search / delete", "git status / diff…"); Playwright file edit + conflict dialog, create/rename/delete/search. All passed.
  • Limitations. Text files up to 2 MiB in the editor; uploads up to 200 MiB; binary files are download-only; no directory download; TOCTOU between check and use is accepted.
  • Security. Every path is confined to the project root (symlink-safe); contents are never logged; audit records paths only.

# 9. Skills and MCP management

  • Status. List skills, commands and agents (user and project scope); enable / disable (move to .disabled/), remove, install from a project directory. List MCP servers (configuration, optional live status), add, remove, test through the claude mcp CLI. Registry search adapter.
  • Main files. R/skills.ts, R/fsx-skills-scan.ts, R/mcp.ts, R/fsx-mcp-config.ts, S/modules/skills-mcp/{index,registry}.ts, W/src/app/(app)/{skills,mcp}/page.tsx.
  • Tests. R/skills.test.ts (14), R/mcp.test.ts (13), S/modules/misc.test.ts (proxy, cache, audit without secrets, registry adapter, 501); real-runtime.test.ts ("skills and MCP listings answer quickly"). All passed.
  • Limitations. Mutations (MCP add / remove / test, skills enable / disable / remove) were tested with mocks and fakes only, not against a real Claude configuration. Installing from the registry is not implemented (501 by design).
  • Security. MCP env and header values are write-only and never stored, logged or audited; skill code is never executed.

# 10. Authorized MacLustr integration

  • Status. Read-only cluster view from agentd; remote tasks over SSH restricted to CR_EXEC_HOSTS (M3U96a, M3U96b); git server access with a git-shell-restricted key; local models panel (empty).
  • Main files. S/modules/cluster/{service,mapping,index}.ts, R/core-task-manager.ts, R/core-task-script.ts, W/src/app/(app)/cluster/page.tsx.
  • Tests. S/modules/misc.test.ts (mapping, staleness, no leak of addresses, persistence, model probes); R/tasks.test.ts ("remote host: runs ssh with the documented argv (fake ssh on PATH)"). All passed. By hand: the node key opens a shell on M3U96a and M3U96b.
  • Limitations. No remote task was launched from the application against a real node. No local model endpoint exists on the cluster. No cluster control actions. See cluster-integration.md.
  • Security. The node key gives a full shell on two compute nodes; the allowlist is enforced by server and runtime; telemetry is filtered of network identifiers.

# 11. Background task management

  • Status. Durable tasks in detached tmux sessions: create, live log, cancel, timeout, retry (idempotent only), artifacts, CPU and memory usage for local tasks.
  • Main files. R/core-task-manager.ts, R/core-task-script.ts, R/tasks.ts, S/modules/tasks/{index,service,artifacts}.ts, W/src/app/(app)/tasks/page.tsx.
  • Tests. R/tasks.test.ts (12: success, failure, cancel, KILL escalation, timeout, log offsets, follow, allowlist, survival across a runtime restart, log cap); real-runtime.test.ts ("tasks: live log stream, SUCCEEDED with usage, artifacts, failure, cancel, retry rules, host allowlist"); Playwright task flow. All passed.
  • Limitations. No scheduler, queue or concurrency limit; task directories are never cleaned up automatically; LOST after a host reboot.
  • Security. The task command is, by design, an arbitrary shell command of the account; commands are not written to logs or audit.

# 12. Real observability

  • Status. System page with per-component health and check times, measured host metrics, per-session CPU / memory, live counts, audit trail, in-app notifications, structured logs.
  • Main files. S/modules/system/index.ts, S/audit.ts, S/modules/notifications/*, R/metrics.ts, W/src/app/(app)/system/page.tsx.
  • Tests. R/main.test.ts (metrics from real formats, real /host/metrics); S/modules/misc.test.ts (status with timestamps, audit pagination, notifications, janitor); real-runtime.test.ts ("/system/status: real host metrics, component health, Claude version"). All passed. Production: the audit log records the real client address through the tunnel.
  • Limitations. No external alerting, no metrics export, no log aggregation; node.offline and storage.low notification kinds are never emitted; backup failures are not signalled.
  • Security. Values that cannot be measured are null / UNKNOWN; logs and audit contain no secrets or content.

# 13. Deployment configuration

  • Status. mld manifest generator, PM2 processes, environment, tunnel route, git adoption — all applied.
  • Main files. deploy/make-manifest.py, .env.example, scripts/ci.sh, deployment.md.
  • Tests. Verified by the deployment itself (2026-11-10): build and migrations on the node, health checks, route.
  • Limitations. No staging environment; redeploy on a second node not rehearsed; no hosted CI.
  • Security. Secrets are generated on the gateway and never committed; .env is 0600; the data directory is 0700.

# 14. Backup and recovery procedures

  • Status. Nightly encrypted backup (database, task metadata, Claude configuration); restore script; one successful restore drill.
  • Main files. deploy/backup.sh, deploy/restore.sh, backup-recovery.md.
  • Tests. On the node: first backup produced (about 20 KB); restored into a scratch database with schema and row counts printed.
  • Limitations. No off-node copy yet. Project files, conversation transcripts and secrets are not in the backup. Disaster-recovery runbook not rehearsed.
  • Security. AES-256-CBC + PBKDF2 with a passphrase file on the same host; no integrity tag.

# 15. Security documentation

# 16. Automated tests

  • Status. 396 unit and integration tests + 21 Playwright tests; local gate.
  • Main files. R/*.test.ts (11 files), S/**/*.test.ts (11 files), W/src/__tests__/* (2 files), W/e2e/* (4 files), W/e2e-real/*, scripts/ci.sh; test doubles S/testkit/{fake-runtime,soft-authenticator,harness}.ts, W/dev/mock-server.mjs.
  • Tests. Results at the top of this page.
  • Limitations. No hosted CI (the git server hosts bare repositories only); tests run on a development machine, not on the node; most Playwright tests use a mock API; ESLint is referenced by the root lint script but not configured.
  • Security. Tests never write to the developer's ~/.claude, never send a prompt to Claude, and use temporary databases and tmux sockets.

# 17. Demonstrated laptop-independence test

  • Status. Not yet demonstrated. Pending the owner.
  • What exists. By construction nothing in the request path involves the laptop: browser → gateway → node. Deployment, health checks and mld heal run from the gateway and the node.
  • Test to run. Laptop powered off; phone on cellular (not the home Wi-Fi): log in at https://claude.spboucher.ai, open a Claude session, send a prompt, lock the phone for several minutes, come back and confirm that the session continued; start a task and read its log.
  • Prerequisites. Owner first-run steps (administrator account, second factor, /login in Claude Code).
  • Limitations. Until this is run, laptop independence is a property of the architecture, not a demonstrated result.

# Cross-cutting limitations

  • Runs under the cluster operator's macOS account, not a dedicated OS identity.
  • Single host = single point of failure.
  • Web Push, registry install, local models, LaTeX / Jupyter integrations: not implemented or not applicable.
  • Real-device mobile, real-browser passkeys, real Claude conversation, real remote tasks, real clone: not verified.
Files main
Menu

Theme