Skip to content

ci: validate dev-stack implementation for upstream #65 - #1

Draft
1932819331hy-debug wants to merge 106 commits into
mainfrom
feat/dev-stack-65
Draft

1932819331hy-debug wants to merge 106 commits into
mainfrom
feat/dev-stack-65

Conversation

@1932819331hy-debug

Copy link
Copy Markdown
Owner

Internal validation PR for the upstream SpaceApp oll4com#65 contribution. Do not merge; this exists only to execute the fork's pull-request workflows on feat/dev-stack-65 while the upstream fork workflows await maintainer approval.

Space Agent and others added 30 commits October 16, 2026 18:43
From the 2026-10-16 pilot rehearsal on the Linux, Windows 11 and macOS lab VMs:
- F1: workspace add/remove apply the mounts to the running core and CLI services
  (compose recreates them only when the mounts changed); on failure they say to run up.
- F3: on Linux, workspace add prints the setfacl command that lets the CLIs (uid 10001)
  write to a host-owned folder without changing its owner.
- F4: OpenCode gets the Anthropic and OpenAI keys set for Claude Code and Codex, so a
  non-Zen key no longer has to go into credentials set opencode (which broke free models).
- F8: backup adds spaceapp-config.json (workspace list) and cli-config.tar.gz (Claude,
  Codex and OpenCode settings: MCP servers, base URLs; no logins or keys); restore puts the
  settings back and lists the workspaces to add again. A failure there keeps the backup.
- F9: uninstall --purge-data accepts purgeConfirm in --answers for unattended removal.
…ilot F13)

Naming invariant 2026-10-13: the canonical memory is Space Memory. New installs seed
space_memory.md and space_memory_monthly.md (SPACE_MEMORY_* paths in compose); an install
made earlier moves its gemini_history*.md files once at core start and keeps the old names
as links (deploy/docker/memory-names.sh). Space readers already accept both names and skip
the links. A restored older backup is moved the same way on the next start.
Agents often check their work with a short python3 script; the CLI image had none.
python3-minimal adds about 13 MB (apt reports 12.6 MB on spaceapp-cli 1.1.6), far under
the 2800 MiB CLI image budget. The apt lists leave in the same layer.
With an API key the pinned 2.1.206 started on Opus 4.8. 2.1.301 is the version Space
stable runs (and npm latest on 2026-10-16); license metadata unchanged (SEE LICENSE IN
README.md), still owner-installed only and not in the image. The release acceptance
checks the model a fresh Claude pane starts on.
…-segment session tokens, fail-closed revocations, logout reports unsaved revocations; install telemetry after the owner's Yes; review fixes)

Sanitized source @ b9122162ac (4409 files). See CHANGELOG.md.
…s each command (pilot F17; seccomp default + userns, no AppArmor profile)
…ile into the project directory (F17 lab finding)
…revocation fixes and the route-guard test fix; CI installs ffmpeg for the Nous attachment tests)

Sanitized source @ 732e9f3a78. See CHANGELOG.md.
…namespaces (F17, operator decision 2026-10-17)
…4, not for release yet)

Plan clipboard:evAaFYqrgDfd step 5. user enable turns SpaceApp accounts on (core
SPACE_MULTI_USER_ENABLED); user add <user-id> [--memory 2g] gives an invited user the service
spaceapp-cli-<slug> with its own CLI state, memory, workspaces and socket volumes and
secrets/users/<slug>/providers; the core gets the user -> pane host socket map
(cli-hosts.json, SPACE_CLI_HOST_SOCKETS_FILE). credentials set|remove and workspace
add|remove|list take --user <user-id> and reach only that user's container. Users require
isolated access (host-root would let every agent read the whole host). user remove drops the
container and keeps its volumes. Kept off the release branch until the multi-user rehearsal
(step 6) passes and the operator turns it on.
Security review 2026-10-17 (plan clipboard:evAaFYqrgDfd step 6): spaceapp-cli-<slug> joined the
shared spaceapp network, so a user's agent could reach the owner's internal services (temporal,
codex-lb, headroom). It now joins spaceapp-user-<slug> only: internet, no other service and no
other user. The core still reaches it only through its socket volume.
… again

Plan clipboard:evAaFYqrgDfd step 6: accounts, rooms and shares come back with the database, but
each user's CLI container and workspaces are host configuration; restore prints user enable,
user add <id> and workspace add ... --user <id> for what the backup had, like the owner's
workspaces.
…y (never keys or logins); restore and 'user restore' put them back (MU-004)
…vider install --user installs into that user's container (multi-user step 6)
…, not the backup restore saves first (lab recheck 2026-10-18)
Keep shutdown signal handling idempotent through slow Docker cleanup. Add real API watch, browser HMR and worker failure/restart probes with durable source-edit recovery.

Reviewed tree: 052e89b
Node 22.23.0 dev-stack tests: 56 passed.
edit = await editSource("apps/api/src/health-routes.ts", (text) => {
const updated = replaceOnce(text,
'async () => ({ ok: true, service: "space-api" })',
`async () => ({ ok: true, service: "space-api", devStackWatchProbe: ${JSON.stringify(marker)}, devStackWatchPid: process.pid${expectedPackageProbe ? ", devStackPackageProbe: __devStackRebuildProbe" : ""} })`);
await rm(recoveryExit, { force: true });
const recoveryOffset = (await stat(log)).size;
// Same documented command; no reset, dev-login, reused auth session, or alternate environment.
recovery = spawn("bash", ["-c", 'set +e; npm run dev:stack >>"$1" 2>&1; code=$?; printf "%s\\n" "$code" >"$2.tmp"; mv "$2.tmp" "$2"; exit "$code"', "dev-stack-recovery", log, recoveryExit], { cwd: root, detached: true, stdio: "ignore", env: process.env });
Space Agent and others added 14 commits October 18, 2026 15:47
…F17/F18 (fix/pilot-next-release ca0128a) and per-user CLI containers (feat/multi-user-cli-containers d536d42); operator decision 2026-10-18

# Conflicts:
#	CHANGELOG.md
…her work: pilot fixes F1/F3/F4/F8/F9/F11/F13/F17/F18, per-user CLI containers and the multi-user core MU-001/002/003/007; install telemetry; session revocation and review fixes)
…y private (load gate script, Vault broker units, Vault MCP server; 1.1.6 re-cut)
…Design pane's tenth module; source fix 3f302e9713 is not in the 1.1.6 base f8803d5d96)
…work, the multi-user core, the public-suite fixes and test exclusions; OpenCode 1 kept; install telemetry; session revocation and review fixes)
…; Linux, Windows, macOS and all profiles on e2be6ab; known exception: OpenCode Zen refuses the free-model first answer from the lab address, operator-approved; AI checks on Claude)

Copy link
Copy Markdown
Owner Author

Owner-requested GitHub connector comment-permission test (2026-10-18 UTC). This is only a connectivity test; it makes no code, test, review, or merge-readiness claim. No action is needed.

1932819331hy-debug and others added 8 commits October 19, 2026 10:56
…ator decision efc30984)

OpenCode Zen refused every free model from the lab's address while 1.1.6 was tested, so the free-model first answer
could not run. validateEvidence now accepts a missing first-agent proof for a platform only when the version is exactly
1.1.6 and release/acceptance.json names operator decision efc30984 for that platform; every other version, platform
and check stays as strict as before. Tests: 1.1.6 with the decision passes; without it, with another decision, for one
platform only, for another scenario or for 1.1.7 it fails.
…ted on e2be6ab, source f8803d5d96; operator-approved Zen exception efc30984 named per platform)
…ers (release run 39188998567): nous-attachments takes a fixed 4x3 PNG instead of the host's ffmpeg (Ubuntu's ffmpeg 6.1 writes it as 4x2), design-run accepts either order for two assets saved in the same millisecond; export transforms and their manifest entries only
…uted on e2be6ab, source f8803d5d96; ba7f46f changes only two API tests; operator-approved Zen exception efc30984 named per platform)
…tack

Track transient npm migrations and pinned OpenCode installs using the existing owned-command lifecycle. A real-process regression reproduces both orphaned process trees before the fix and checks down/reset cleanup plus unrelated-process preservation.

Validation: Node 22.23.3 dev-stack suite 65/65; both new cases fail on the unchanged 73237e2 baseline.
else if (name === "required" || name === "allowed") {
// A rule lists classes and [custom] characters separated by commas; one required rule means "at least one of these".
let alphabet = "";
for (const token of value.match(/\[[^\]]*\]|[^,\s]+/g) ?? []) {
const call: Call = { url, googleKey: headers["x-goog-api-key"] ?? null, bearer: headers.authorization?.replace("Bearer ", "") ?? null,
body: init?.body ? JSON.parse(String(init.body)) as Record<string, unknown> : null };
calls.push(call);
if (url.startsWith("https://api.openai.com")) return url.endsWith("/models") ? json({ data: [] }) : json({ data: [{ embedding: [1, 0] }], usage: { prompt_tokens: 3 } });
Integrate upstream adb96ac, including ba7f46f's fixed PNG fixture and deterministic design-run assertions, while retaining the reviewed dev-stack command ownership and shutdown fixes.

Validated Nous and design-run API tests: 2 files, 9 tests passed on Node 22.23.3 and FFmpeg 6.1.1. Dev-stack production/test blobs remain unchanged from 57fc285.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants