feat: JobKindConfig fase 4 — skills pre-install + runtime-aware runner (gates op host) #41

Merged
janpeter merged 4 commits from claude/job-kind-config-phase4 into master 2026-06-17 18:12:26 +02:00
Owner

Summary

Fase 4 van de JobKindConfig-feature in scrum4me-docker: skills pre-installeren + de runner runtime-aware maken. Code-only PR — de container-verificatie-gates draaien op een echte worker-host (zie hieronder), niet op deze Mac (Docker-daemon uit + Mac-VM ≠ de geharde prod-host voor de sandbox-gate).

  • Skills-bronmap skills/scrum4me-job-workflow/SKILL.md (+ .gitkeep); name matcht 1:1 de fase-1 SKILLS_REGISTRY-entry.
  • Dockerfile (base-stage): COPY skills/ → /opt/agent/etc/skills/ — buiten /home/agent, dus niet gemaskeerd door het per-replica disk-volume.
  • entrypoint.sh: runtime skill-install (ongegate, beide runtimes) via gosu agent, idempotent (cp -a per skill, geen rm -rf) naar ~/.claude/skills én ~/.codex/skills.
  • run-one-job.ts: zachte skill-prompt-injectie uit ctx.config.skills (lege lijst → geen sectie); CODEX-tak voedt buildCodexArgs met model/sandboxMode/thinkingBudget (fase-3 contract); runtime-aware audit-log (CODEX heeft sandbox_mode, geen permission_mode/allowed_tools). ctx.config is na fase 3 een RuntimeJobConfig (discriminated union) → narrowed op runtime.
  • MCP-ref: geen Dockerfile-wijziging nodig — ARG MCP_GIT_REF=main bevat fase 3 (#59 gemerged). Rebuild met --build-arg MCP_CACHE_BUST=$(date +%s) om mcp-main opnieuw te clonen.

Lokaal geverifieerd (zonder Docker)

  • bash -n bin/entrypoint.sh — syntax OK
  • skills-COPY staat in de base-stage (vóór FROM base AS codex)
  • grep-checks: buildSkillsSection/skillsSection, buildCodexArgs({…sandboxMode,thinkingBudget}), runtime-aware logregels

⚠️ Verificatie-gates — DRAAIEN OP EEN ECHTE WORKER-HOST (154/max2)

run-one-job.ts importeert uit /opt/scrum4me-mcp/... (container-paden) → standalone-typecheck kan niet; tsx parset 'm bij runtime. Build + run de image op de host:

docker build -t s4m:p4 --build-arg MCP_CACHE_BUST=$(date +%s) .
docker build --target codex -t s4m-codex:p4 --build-arg MCP_CACHE_BUST=$(date +%s) .
  1. Sandbox-gate (Task 7, HARD): werkt --sandbox read-only/workspace-write onder de geharde container (--read-only --cap-drop ALL --security-opt no-new-privileges)? Verwachting NO-GO (codex' bwrap kan geen user-namespace maken) → dan blijft danger-full-access de enige werkbare codex-sandbox en moet de fase-2-seed (read-only/workspace-write) via een follow-up-seed terug naar danger-full-access (web). Leg de uitkomst (GO/NO-GO) vast.
  2. Pinned-CLI override-smoke (Task 8): codex @0.137.0-alpha.4 accepteert --model/--sandbox/-c model_reasoning_effort.
  3. SKILL.md-frontmatter-compat: zowel Claude als Codex laden de name/description-frontmatter.
  4. codex exec --ephemeral skill-discovery uit ~/.codex/skills.
  5. Full smoke (Task 9): skills aanwezig in beide ~/.{claude,codex}/skills; image-codex-args.ts bevat sandboxMode/thinkingBudget.

Afhankelijkheden

Fase 1 (#21/#22), fase 2 (#90), fase 3 (#59) — allemaal gemerged. Volgende: fase 5 (enqueue stop-freeze), fase 6 (workers UI).

🤖 Generated with Claude Code

## Summary Fase 4 van de JobKindConfig-feature in **scrum4me-docker**: skills pre-installeren + de runner runtime-aware maken. Code-only PR — de **container-verificatie-gates draaien op een echte worker-host** (zie hieronder), niet op deze Mac (Docker-daemon uit + Mac-VM ≠ de geharde prod-host voor de sandbox-gate). - **Skills-bronmap** `skills/scrum4me-job-workflow/SKILL.md` (+ `.gitkeep`); `name` matcht 1:1 de fase-1 `SKILLS_REGISTRY`-entry. - **Dockerfile** (base-stage): `COPY skills/ → /opt/agent/etc/skills/` — buiten `/home/agent`, dus niet gemaskeerd door het per-replica disk-volume. - **entrypoint.sh**: runtime skill-install (ongegate, beide runtimes) via `gosu agent`, idempotent (`cp -a` per skill, geen `rm -rf`) naar `~/.claude/skills` én `~/.codex/skills`. - **run-one-job.ts**: zachte skill-prompt-injectie uit `ctx.config.skills` (lege lijst → geen sectie); CODEX-tak voedt `buildCodexArgs` met `model`/`sandboxMode`/`thinkingBudget` (fase-3 contract); runtime-aware audit-log (CODEX heeft `sandbox_mode`, geen `permission_mode`/`allowed_tools`). `ctx.config` is na fase 3 een `RuntimeJobConfig` (discriminated union) → narrowed op `runtime`. - **MCP-ref**: geen Dockerfile-wijziging nodig — `ARG MCP_GIT_REF=main` bevat fase 3 (#59 gemerged). **Rebuild met** `--build-arg MCP_CACHE_BUST=$(date +%s)` om mcp-main opnieuw te clonen. ## Lokaal geverifieerd (zonder Docker) - [x] `bash -n bin/entrypoint.sh` — syntax OK - [x] skills-COPY staat in de **base**-stage (vóór `FROM base AS codex`) - [x] grep-checks: `buildSkillsSection`/`skillsSection`, `buildCodexArgs({…sandboxMode,thinkingBudget})`, runtime-aware logregels ## ⚠️ Verificatie-gates — DRAAIEN OP EEN ECHTE WORKER-HOST (154/max2) `run-one-job.ts` importeert uit `/opt/scrum4me-mcp/...` (container-paden) → standalone-typecheck kan niet; tsx parset 'm bij runtime. Build + run de image op de host: ``` docker build -t s4m:p4 --build-arg MCP_CACHE_BUST=$(date +%s) . docker build --target codex -t s4m-codex:p4 --build-arg MCP_CACHE_BUST=$(date +%s) . ``` 1. **Sandbox-gate (Task 7, HARD):** werkt `--sandbox read-only`/`workspace-write` onder de geharde container (`--read-only --cap-drop ALL --security-opt no-new-privileges`)? **Verwachting NO-GO** (codex' bwrap kan geen user-namespace maken) → dan blijft `danger-full-access` de enige werkbare codex-sandbox en moet de **fase-2-seed** (`read-only`/`workspace-write`) via een follow-up-seed terug naar `danger-full-access` (web). Leg de uitkomst (GO/NO-GO) vast. 2. **Pinned-CLI override-smoke (Task 8):** codex `@0.137.0-alpha.4` accepteert `--model`/`--sandbox`/`-c model_reasoning_effort`. 3. **SKILL.md-frontmatter-compat:** zowel Claude als Codex laden de `name`/`description`-frontmatter. 4. **codex `exec --ephemeral` skill-discovery** uit `~/.codex/skills`. 5. **Full smoke (Task 9):** skills aanwezig in beide `~/.{claude,codex}/skills`; image-`codex-args.ts` bevat `sandboxMode`/`thinkingBudget`. ## Afhankelijkheden Fase 1 (#21/#22), fase 2 (#90), fase 3 (#59) — allemaal gemerged. Volgende: fase 5 (enqueue stop-freeze), fase 6 (workers UI). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ctx.config is na fase 3 een RuntimeJobConfig (discriminated union); runner
narrowed op runtime. CODEX-tak voedt buildCodexArgs met model/sandboxMode/
thinkingBudget; zachte skill-sectie uit ctx.config.skills (beide runtimes).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
janpeter merged commit e66fddfe1f into master 2026-06-17 18:12:26 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/scrum4me-docker!41
No description provided.