feat(dispatch): model-claude-kind voor Claude-reviews als dispatchjob (M41 5b C1, T-1964) #101
No reviewers
Labels
No labels
severity/s3
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/scrum4me-docker!101
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/m41-model-claude"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Samenvatting
M41 increment 5b, taak C1 (Scrum4Me T-1964, story ST-1619, plan §14): een model-claude-kind, zodat een
QUEUE_REVIEWmet runtime CLAUDE als afgeschermde dispatchjob kan draaien. Het kind authenticeert met een eigenclaude setup-token, dat als operatorbronclaude_oauth_tokenwordt aangeleverd.create, alsruntime: 'CLAUDE'. De broker zet danDISPATCH_CHILD_RUNTIME=CLAUDE. Zonder die variabele start het bestaande Codex-kind, met exact dezelfde container-args als nu.lib/dispatch-child.ts.source_artifactsen wordt uit de uitvoer geredigeerd.CLAUDE_CODE_OAUTH_TOKENnaar de env van de CLI. Daarbij staanCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1enDISABLE_AUTOUPDATER=1gezet.queue/review.mdenqueue/task.md.-p … --output-format stream-json --verbose --permission-mode acceptEdits --allowedTools Read,Glob,Grep,Bash,Write,Edit --add-dir /sources --add-dir /output, plus--modelen--effort. Dat is geenbypassPermissions.childModelFromConfigwerkt nu ook voor CLAUDE. Een numeriek budget gaat via de gedeeldemapBudgetToEffort, dezelfde mapping als de gewone Claude-runner.max, dat alleen voor Claude geldt.DISPATCH_CLAUDE_MODELenDISPATCH_CLAUDE_EFFORT.Dockerfile.dispatch.model-claudeenmodel-claude-probe, met dezelfde node-digest, uid 10001 en entrypoint als Codex.CLAUDE_CODE_VERSION=2.1.287, met een pariteitstest tegenDockerfile.claudealleen in die stages toe.api.anthropic.com, en één broker/egress/supervisor per slot.Praktijkbewijs (C0, scrum4me-server, 2026-10-03)
Opzet:
--network none, een read-only rootfs en--cap-drop ALL.api.anthropic.com, en dezelfdestartEgressBridgeals het kind.Uitkomst:
claude-opus-5-5; 3 turns in 6,1 s./output/result.jsonbevat de regel uit de read-only/work.Test
tsc -p tsconfig.dispatch.jsonis groen.npm test: 1066 tests groen. Er falen 2 tests, intranscript-retention; die falen alleen op macOS en zijn bekend.Uitrol
Pas bij C2 en op opdracht van JP. Deze PR raakt ook supervisorcode (
prepareinlib/dispatch-runtime.ts). Bij de uitrol moet het supervisor-image dus ook opnieuw gebouwd worden, voor beide slots.🤖 Generated with Claude Code
REQUEST_CHANGES
cwdmee. Het nieuwe image gebruiktWORKDIR /opt/dispatch(Dockerfile.dispatch:78) en de containerargs zetten geen werkdirectory. Daardoor start Claude in/opt/dispatch, terwijl de checkout in/workstaat. Codex corrigeert dit via--cd /work; Claude heeft die correctie niet en voegt alleen/sourcesen/outputtoe. Relatieve repositorycommando's werken dus in de verkeerde directory en edits raken het read-only rootfs. Zetcwd: '/work'expliciet bij spawn en voeg een entrypoint-test toe die de cwd controleert.modelConfig, maar de runtimeport kiest de runtime uit het profiel en laat een model van de andere runtime weg. Bij de ondersteunde mismatch kan de log daarom Codex/GPT vermelden terwijl Claude met CLI-default draaide. Gebruik dezelfde profielruntime en model-resolutie voor uitvoering en logging; test de mismatch ook in de run-log.geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
De adapter hergebruikt de bestaande credential-, egress- en resultaatvalidatie; unit-tests en operator-documentatie zijn uitgebreid. Productdocs architecture/overview en runbooks/agent-shared-tsx-env-and-redeploy zijn geraadpleegd. De onafhankelijke checkout is gecontroleerd op commit
c02e14ce4c. Dispatch-typecheck en git diff --check slagen. Vitest kon hier niet starten doordat /tmp noexec is (native rolldown-binding); Docker is niet beschikbaar, dus de image-/egress-integratietests zijn niet uitgevoerd. De bestaande model-image-integratiescript bouwt bovendien alleen de Codex-probe; de nieuwe Claude-stub wordt daar nog niet aangeroepen.Beide punten van review 952 zijn verwerkt in
5582a41, test-first: de nieuwe tests faalden eerst en slagen nu./work. De spawn krijgtcwd: '/work'uit de Claude-adapter (lib/dispatch-child.ts);bin/run-dispatch-child.tsgeeft de opties ongewijzigd door aanspawn. De Codex-spawn blijft zoals hij was en krijgt geen cwd; Codex gebruikt--cd /work. Test: "starts claude in the /work checkout, and leaves the codex spawn as it was".writeRunLogkrijgt nu de runtime van het profiel, metruntimeinRunLogInput, uitconfig.profile.runtimeinbin/run-dispatch-attempt.ts. Een modelconfig van de andere runtime wordt niet gelogd; dat is dezelfde regel als in de runtime-port. Test: "logs the profile runtime and the CLI default when the model config is of the other runtime".tsc -p tsconfig.dispatch.jsonis groen.npm testgeeft 1068 groen; daarnaast falen de 2 bekende macOS-tests intranscript-retention.Opmerking over de integratieproef: het script draait de Claude-stub nog niet mee. De echte CLI is in C0 al op srv bewezen, met precies deze flags. Ik heb het script daarom niet uitgebreid.
COMMENT
geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
tests/dispatch-model-image.integration.shbouwt uitsluitendmodel-codex-probe; de bijbehorende TypeScript-harness test uitsluitend Codex. Koppel de Claude-probe aan een scenario dat runtimekeuze, OAuth-env, redactie en toegestaan/geweigerd CONNECT-verkeer controleert. De nieuwe image en stub alleen leveren nog geen uitvoerbare Claude-integratiedekking.Beoordeling en verificatie
Beoordeeld op commit
5582a41c892715af9ecdb0075df3184c1de0df62. De runtime wordt vanuit het profiel doorgegeven; modelconfig van een andere runtime wordt geweigerd voor doorgifte. De Claude-token blijft buiten de payload en wordt uit transcript/resultaat geredigeerd. De wijziging hergebruikt de bestaande containerisolatie, gedeelde effort-mapping en resultaatvalidatie; de operator-documentatie beschrijft het nieuwe slot en de credentialbron. Geen blokkerend defect vastgesteld bij statische review.Dispatch-typecheck geslaagd (
node node_modules/typescript/bin/tsc -p tsconfig.dispatch.json). Testsuite niet uitgevoerd: Vitest faalt vóór testcollectie doordat/tmpmetnoexecis gemount en de native Rolldown-binding niet kan laden. Docker ontbreekt, dus image-/egress-integratietests konden evenmin draaien. De in code/docs genoemde live C0-proef is niet onafhankelijk herhaald. Door deze verificatiebeperking en de integratiedekkingsopmerking is het verdictCOMMENT.