S251 Handoff
Documentation for Sessions
S251 Technical Handoff
Session: 251 | Date: 2026-03-21 | Branch: session-254-260 (shared, concurrent sessions)
Agent: Claude Code (Opus 4.6) | Status: Complete — pending commit
1. What Was Done
3 Critical Pipeline Bugfixes (deployed to Hetzner)
| # | Bug | Root Cause | Fix | File |
|---|---|---|---|---|
| 1 | Generation files silently lost | Express body parser 100KB default rejects 136-file payloads | json({ limit: '50mb' }) + NGINX client_max_body_size 50m |
APIs/sandbox-orchestrator/src/main.ts |
| 2 | VFS file-reads target wrong repo | parseRepoPath('gograbspace/a/b') returns ['gograbspace','a'] not ['a','b'] |
Take last 2 segments: parts[parts.length-2], parts[parts.length-1] |
APIs/backend-api/src/app/git-provider/remote-git-provider.service.ts, local-git-provider.service.ts |
| 3 | Deploy phase hides git errors | Catch block logs but never emits SSE | Added module-gen.git-commit-failed SSE event |
APIs/backend-vitto-api/src/app/module-generation/phases/module-gen-phase.executor.ts |
5 New Hetzner Endpoints (deployed)
| Endpoint | Method | Purpose |
|---|---|---|
/git/repos |
GET | List ALL repos with stats |
/git/repos/:org/:repo/commits |
GET | Commit history (branch, limit params) |
/git/repos/:org/:repo/commits/:sha |
GET | Commit diff (files, insertions, deletions) |
/git/repos/:org/:repo/branches/:branch |
DELETE | Delete branch |
| Body parser fix | — | 100KB → 50MB |
NX Library: @libs-structural/git-operations
libs/libs-structural/git-operations/src/
├── index.ts # Public API
└── lib/
├── models/
│ ├── git-operations.types.ts # 15 interfaces
│ └── git-operations-role.config.ts # 4-tier role system, 10 feature flags
├── services/
│ ├── git-operations-api.service.ts # HTTP client (DI-injectable baseUrl + apiKey)
│ ├── git-operations-state.service.ts # Reactive state (30+ signals, polling, filtering)
│ └── git-operations-format.utils.ts # Pure formatting (timeAgo, shortenSha, fileSize, etc.)
└── config/
└── git-operations.providers.ts # provideGitOperations() factory
Git Operations Dashboard (gograb-dev)
- Route:
/platform/git-operations - Features: server metrics, repo cards, branch management, commit history with expandable diff, file browser with search
2. Current State
What Works
- All Hetzner git endpoints: list repos, branches, files, commits, commit diff, push files, create/delete/merge branches
- Git Operations dashboard renders live data
- Body parser: 500-file/851KB stress test passes in 1.7s
- 177 automated tests pass
- Library type-checks clean, app builds clean
What Does NOT Work Yet
- Railway backends NOT redeployed — parseRepoPath fix and SSE error event are in codebase but NOT on Railway
- Full generation E2E NOT verified — bugs are fixed but nobody has triggered a new generation since the fix
- Git graph visualization NOT built — designed and logged as MCP decision but not implemented
- Reusable sub-components NOT extracted — UI is in gograb-dev templates, not library components
- Production CORS NOT solved — proxy.conf.json only works for dev server
- Live Preview race condition NOT fixed —
modulesLoaded$fires before VFS files are written
Uncommitted Changes
The following files were modified but NOT committed (per user instruction — concurrent sessions):
Sandbox Orchestrator:
APIs/sandbox-orchestrator/src/main.ts— body parser 50MBAPIs/sandbox-orchestrator/src/app/git/git.service.ts— listAllRepos, getCommitHistory, getCommitDiff, deleteBranchAPIs/sandbox-orchestrator/src/app/git/git.controller.ts— 5 new endpoints
Backend API:
APIs/backend-api/src/app/git-provider/remote-git-provider.service.ts— parseRepoPath fixAPIs/backend-api/src/app/git-provider/local-git-provider.service.ts— repoDir fix +..guard
Backend Vitto API:
APIs/backend-vitto-api/src/app/module-generation/phases/module-gen-phase.executor.ts— SSE error event, featureBranch scoping
Library (new):
libs/libs-structural/git-operations/— entire library (8 files)config/tsconfig-paths/modules/generated.paths.json—@libs-structural/git-operationsalias
Dashboard:
apps/gograb-dev/src/app/pages/infrastructure/git-operations/— 3 files (ts, html, scss)apps/gograb-dev/src/app/app.routes.ts—/platform/git-operationsrouteapps/gograb-dev/src/app/app.ts— sidebar nav entryapps/gograb-dev/src/app/app.config.ts— provideGitOperations() registration
Config:
libs/libs-foundational/api-config/proxy.conf.json—/sandbox-apiproxy entry
3. Two-Server Hetzner Infrastructure
AX42-U (Current) — Internal Dev Server
- IP: 144.76.69.55 | DNS: sandbox.gograb.space
- Specs: 8C/16T Ryzen 7 PRO 8700GE, 128GB DDR5
- Runs: sandbox-orchestrator (port 3010), NGINX (443), git repos at
/data/platforms/ - API Key:
W8Wp0ltL8El_qRnXyoUoD0ffuSfZzmbn7Y7SVrx1k8s
AX102-U (New) — Customer Sandbox Server
- IP: 178.63.165.83 | DNS: not configured yet
- Specs: 16C/32T Ryzen 9 7950X3D, 128GB DDR5
- Status: Hardware ready, OS installed, needs software setup
- Next steps: Install Node.js, deploy sandbox-orchestrator, configure NGINX + Let's Encrypt SSL, set up Firecracker
4. What the Next Agent Should Do First
Priority 1: Commit All Changes
All S251 changes are uncommitted. The next agent should:
- Check
git statusfor the full list - Commit with:
[S251.1] feat: fix Hetzner pipeline + git-operations library + dashboard - Include specific files (never
git add .)
Priority 2: Redeploy Railway Backends
The parseRepoPath fix and SSE error events must reach production:
- Redeploy
backend-apion Railway (has parseRepoPath fix) - Redeploy
backend-vitto-apion Railway (has SSE error event)
Priority 3: Build Git Graph Visualization
The user's top requested feature. Architecture decision already logged (MCP ID: dev_1774111802647_rc9smr0):
- Add
parentShas[]to commit history endpoint response - Build lane assignment algorithm (which visual column for each branch)
- Build
git-graphstandalone component with SVG (commit nodes, branch lines, merge arrows) - Make interactive (click commit → expand diff, hover → tooltip)
Priority 4: Set Up AX102-U
The new server is ready for software setup:
- SSH into 178.63.165.83
- Install Node.js 20, yarn, simple-git
- Deploy sandbox-orchestrator
- Configure NGINX with SSL (Let's Encrypt)
- Set up Firecracker kernel + rootfs
5. Key Environment Variables
Hetzner Server (AX42-U)
SANDBOX_API_KEY=W8Wp0ltL8El_qRnXyoUoD0ffuSfZzmbn7Y7SVrx1k8s
PLATFORM_REPOS_ROOT=/data/platforms
PLATFORM_TEMPLATE_PATH=/data/templates/platform-base-template
PORT=3010
Railway (backend-api)
PLATFORM_GIT_SERVER_URL=https://sandbox.gograb.space
PLATFORM_GIT_API_KEY=W8Wp0ltL8El_qRnXyoUoD0ffuSfZzmbn7Y7SVrx1k8s
Railway (backend-vitto-api)
PLATFORM_GIT_SERVER_URL=https://sandbox.gograb.space
PLATFORM_GIT_API_KEY=W8Wp0ltL8El_qRnXyoUoD0ffuSfZzmbn7Y7SVrx1k8s
Dev Proxy (proxy.conf.json)
"/sandbox-api": {
"target": "https://sandbox.gograb.space",
"secure": true,
"changeOrigin": true,
"pathRewrite": { "^/sandbox-api": "" }
}
6. MCP Intelligence
Decisions Logged
| ID | Type | Summary |
|---|---|---|
dev_1774111649848_2r1kx44 |
bugfix | Body parser + parseRepoPath + SSE fixes |
dev_1774111671403_0kmixf8 |
architecture | Library architecture with DI + role flags |
dev_1774111695328_9o9y26a |
infrastructure | CORS proxy solution |
dev_1774111802647_rc9smr0 |
architecture | Git graph decomposed component plan |
dev_1774273643988_ub6gilg |
infrastructure | Two-server Hetzner layout |
dev_1774273666678_4vzdgd5 |
architecture | Git-operations library 3-layer structure |
Conventions Added
| Category | Rule |
|---|---|
| angular | NX libraries must use InjectionToken + provideXxx() factory |
| infrastructure | Hetzner body parser = 50MB, NGINX must match |
| git-provider | parseRepoPath takes last 2 segments |
| infrastructure | AX42-U = IDS, AX102-U = Customer Sandbox |
How to Recall Context
// Start of next session
preflight({ task: "S252: Git graph + AX102-U setup" })
find_similar({ query: "git operations hetzner pipeline" })
intelligence({ action: "recall", situation: "git graph SVG visualization" })
convention({ action: "get", category: "infrastructure" })
7. Validation Checklist
Before Making Changes
-
git status— check uncommitted changes from S251 -
curl https://sandbox.gograb.space/health— verify Hetzner is up -
npx tsc --noEmit --project libs/libs-structural/git-operations/tsconfig.lib.json— library type-checks -
npx tsc --noEmit --project apps/gograb-dev/tsconfig.app.json— app type-checks
After Changes
-
npx nx test backend-api --testPathPattern="git-provider"— 177 tests must pass -
npx nx build sandbox-orchestrator— must succeed -
npx nx build backend-api— must succeed -
npx nx build backend-vitto-api— must succeed - Deploy:
scp dist/APIs/sandbox-orchestrator/main.js [email protected]:/var/lib/sandbox-orchestrator/main.js - Verify:
curl -H "X-API-Key: W8Wp0ltL8El_qRnXyoUoD0ffuSfZzmbn7Y7SVrx1k8s" https://sandbox.gograb.space/git/repos
Generated by Claude Code (Session 251) — March 21, 2026