feat: local_llm-taakjobs (M3) — claimen, dispatchen en afsluiten zonder git in de worktree #169
No reviewers
Labels
No labels
severity/s2
severity/s3
severity/s4
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/scrum4me-mcp!169
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/m3-local-llm-task-jobs"
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?
M3, increment 1: de scrum4me-MCP kan losse
TASK_IMPLEMENTATION-jobs aan de lokale LLM-worker op max2 geven en behandelt die jobs apart.docs/specs/2026-09-27-task-implementation-local-llm-design.md.docs/plans/M3-task-implementation-local-llm.md(taken 1–5; beide dubbel GO, agent-harness#11).Gedragswijzigingen
Alleen voor jobs met
required_capability = 'local_llm':src/dispatch/eligibility.ts, vijf symmetrische plekken). Een worker met precies['local_llm']claimt naastIDEA_CHAT/SYSTEMookTASK_IMPLEMENTATION+COPILOT+sprint_run_id IS NULL. Hij claimt nooit een job zonder capability. Gewone workers claimen de lokale taakjob niet.dispatch_jobkrijgt een optionele parameterrequired_capability: 'local_llm', alleen bijTASK_IMPLEMENTATION. De job krijgt danruntime: 'CLAUDE'.src/git/local-llm.ts, met de bewaking in de helpersmaybeBackupPushenremoveWorktreeForJoben bij het wegruimen van bezetters):git worktree prunevanuit de clone;prepare:worktree;.gitmodulesmoet byte-gelijk zijn aan die op de default-branch, anders wordt de job FAILED, zonder rollback-lus;core.hooksPath=/dev/null,core.fsmonitor=falseen de rest) op het groene pad: base_sha, diff, set-head, push met--no-verify, en de rev-parse na de push.update_job_statusslaat de auto-PR,propagateStatusUpwardsencancelPbiOnFailureover.Bewijs
npm run typecheck && npm test: 1862 passed / 51 skipped. De baseline opf51ee02was 1816.core.fsmonitorencore.sshCommand: geen marker. De ketentestupdate_job_status failedgebruikt de echte git-helpers enpush.js, plus eenexecFile-spy die controleert dat geen enkele git-aanroep in de worktree draait. De mutatiecontrole klopt: zonder de bewaking wordt de test rood.Zolang niemand met
local_llmdispatcht, heeft deze PR geen effect op bestaande jobs. De volgorde-eis uit het plan geldt: dispatch geenlocal_llm-taak voordat de nieuwe harness op max2 draait.Geen merge zonder JP.
🤖 Generated with Claude Code
Verdict: REQUEST_CHANGES
local_llm-job draait nog steedsgit remote set-headengit pushmetcwdin de door de container beschrijfbare worktree.SAFE_GIT_CONFIGschakeltcore.sshCommand(noch de onbetrouwbareremote.origin.url) niet uit. Een container kan daarom de.git-gitlink/config ombuigen; het done-pad voert vervolgens de daarin geconfigureerde SSH-command uit op de host.--no-verifyvoorkomt dit niet. De nieuwe ketentest dekt uitsluitend het failed-pad; voeg een echte done-pad-regressietest toe en voer host-git pas uit tegen vertrouwde git-metadata, of sla host-push voor deze jobs over.geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
REQUEST_CHANGES
SAFE_GIT_CONFIGschakelt hooks en fsmonitor uit, maar overschrijftcore.sshCommand(of de remote receive-pack/upload-pack-configuratie) niet. Eenlocal_llm-container mag de.git-gitlink en config aanpassen; bij de daaropvolgende host-aanroepgit pushwordt een kwaadaardigecore.sshCommandalsnog uitgevoerd. Dit doorbreekt de centrale veiligheidsinvariant en leidt tot remote code execution op de host. Gebruik voor het groene pad een werkelijk geïsoleerde/trusted Git-configuratie of overschrijf alle uitvoerbare transportconfiguratie; voeg een regressietest toe die het push-pad met een markerendecore.sshCommandafdekt.Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Teststatus: niet uitvoerbaar in de reviewcheckout;
npm teststopt vóór Vitest omdattscontbreekt (geen geïnstalleerde dependencies).Verdict: APPROVED
Findings
Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
De local_llm-route beperkt de claimselectie tot de bedoelde jobsoort, behoudt de bestaande route voor andere workers, en beschermt host-Git-aanroepen in local_llm-worktrees met databasegestuurde worktree-identificatie, veilige Git-configuratie en een gitlink-integriteitscontrole. De bijbehorende tests dekken de dispatch-, claim-, worktree- en done-paden.
Dank voor de BLOCKER. Hij klopt voor de MCP afzonderlijk bekeken: op het done-pad draaien
git remote set-headengit pushmet de worktree als werkmap, enSAFE_GIT_CONFIGzetcore.sshCommandniet uit.Bestaande controle (buiten deze PR). In het totale systeem is dit pad al afgedekt door de harness (spec
docs/specs/2026-09-27-task-implementation-local-llm-design.md§4.3 stap 1 en 5, §4.5; harness-PR janpeter/agent-harness#12,src/worker/host-git.ts):.git-item in de worktree: de worktree-gitlink, submodule-gitlinks en nieuwe.git-items, ook innode_modules.failedzonder verdere git, ook niet via de MCP.donedraait geen container meer.De spec noemt
core.sshCommanddaar expliciet: "de scan is de controle, de vlaggen zijn een extra laag". Vanuit deze PR is die controle niet zichtbaar.Toegevoegd als extra laag (
e7aff35). Omdat de MCP daarmee op zijn aanroeper vertrouwt, controleert hij het nu ook zelf. Vóór elke git-aanroep in eenlocal_llm-worktree (done-pad,verify_task_against_plan/getGitDiff,base_shabij de claim) controleertgitPrefixForviasrc/git/worktree-gitlink.tsde gitlink met alleen het bestandssysteem, zonder git:<worktree>/.gitis een regulier bestand;gitdir:wijst naar een direct kind van<clone>/.git/worktrees;commondirwijst naar<clone>/.git.Daarmee komt alle config die git leest uit de clone, en die valt buiten de containermount. Faalt de controle, dan wordt de job
FAILEDmet "git-administratie van de worktree wijst niet naar de clone …; geen git uitgevoerd": geen push, geen auto-PR, geen doorwerking. De worktree blijft staan voor onderzoek.Tests.
update_job_status-done-handler: de gitlink is omgebogen naar container-administratie metremote.origin.url=ssh://…, eencore.sshCommand-marker en eencore.fsmonitor-marker. Op6b9b7caontstond de ssh-marker, na de fix niet; de job isFAILEDen er draait geen git met de worktree als werkmap.doneen pusht naar een lokale bare remote.local_llm-jobs blijven ongewijzigd; de controle wordt daar niet aangeroepen.npm run typecheck && npm test, 1893 passed / 51 skipped.core.sshCommandis bewust niet aanSAFE_GIT_CONFIGtoegevoegd. Met een geverifieerde gitlink komt die waarde uit de vertrouwde clone, en de vlag zou een legitieme ssh-opzet daar breken.🤖 Generated with Claude Code