feat: local_llm-taakjobs (M3) — claimen, dispatchen en afsluiten zonder git in de worktree #169

Merged
janpeter merged 10 commits from feat/m3-local-llm-task-jobs into main 2026-09-28 03:01:32 +02:00
Owner

M3, increment 1: de scrum4me-MCP kan losse TASK_IMPLEMENTATION-jobs aan de lokale LLM-worker op max2 geven en behandelt die jobs apart.

  • Spec: agent-harness docs/specs/2026-09-27-task-implementation-local-llm-design.md.
  • Plan: agent-harness docs/plans/M3-task-implementation-local-llm.md (taken 1–5; beide dubbel GO, agent-harness#11).
  • Scrum4Me: sprint S-2026-09-27-1, T-18 t/m T-22.

Gedragswijzigingen

Alleen voor jobs met required_capability = 'local_llm':

  1. Claimfilter (src/dispatch/eligibility.ts, vijf symmetrische plekken). Een worker met precies ['local_llm'] claimt naast IDEA_CHAT/SYSTEM ook TASK_IMPLEMENTATION + COPILOT + sprint_run_id IS NULL. Hij claimt nooit een job zonder capability. Gewone workers claimen de lokale taakjob niet.
  2. dispatch_job krijgt een optionele parameter required_capability: 'local_llm', alleen bij TASK_IMPLEMENTATION. De job krijgt dan runtime: 'CLAUDE'.
  3. Geen git in de worktree buiten het groene pad (src/git/local-llm.ts, met de bewaking in de helpers maybeBackupPush en removeWorktreeForJob en bij het wegruimen van bezetters):
    • geen backup-push;
    • opruimen via het bestandssysteem, gevolgd door git worktree prune vanuit de clone;
    • dit werkt ook als de worktree-root een symlink bevat.
  4. Worktree-aanmaak zonder repo-code:
    • geen prepare:worktree;
    • een submodule-gate: de .gitmodules moet byte-gelijk zijn aan die op de default-branch, anders wordt de job FAILED, zonder rollback-lus;
    • veilige git-vlaggen (core.hooksPath=/dev/null, core.fsmonitor=false en de rest) op het groene pad: base_sha, diff, set-head, push met --no-verify, en de rev-parse na de push.
  5. update_job_status slaat de auto-PR, propagateStatusUpwards en cancelPbiOnFailure over.

Bewijs

  • npm run typecheck && npm test: 1862 passed / 51 skipped. De baseline op f51ee02 was 1816.
  • Markerproeven met een omgebogen gitlink naar git-administratie met core.fsmonitor en core.sshCommand: geen marker. De ketentest update_job_status failed gebruikt de echte git-helpers en push.js, plus een execFile-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_llm dispatcht, heeft deze PR geen effect op bestaande jobs. De volgorde-eis uit het plan geldt: dispatch geen local_llm-taak voordat de nieuwe harness op max2 draait.

Geen merge zonder JP.

🤖 Generated with Claude Code

M3, increment 1: de scrum4me-MCP kan losse `TASK_IMPLEMENTATION`-jobs aan de lokale LLM-worker op max2 geven en behandelt die jobs apart. - Spec: agent-harness `docs/specs/2026-09-27-task-implementation-local-llm-design.md`. - Plan: agent-harness `docs/plans/M3-task-implementation-local-llm.md` (taken 1–5; beide dubbel GO, agent-harness#11). - Scrum4Me: sprint S-2026-09-27-1, T-18 t/m T-22. ## Gedragswijzigingen Alleen voor jobs met `required_capability = 'local_llm'`: 1. **Claimfilter** (`src/dispatch/eligibility.ts`, vijf symmetrische plekken). Een worker met precies `['local_llm']` claimt naast `IDEA_CHAT`/`SYSTEM` ook `TASK_IMPLEMENTATION` + `COPILOT` + `sprint_run_id IS NULL`. Hij claimt nooit een job zonder capability. Gewone workers claimen de lokale taakjob niet. 2. **`dispatch_job`** krijgt een optionele parameter `required_capability: 'local_llm'`, alleen bij `TASK_IMPLEMENTATION`. De job krijgt dan `runtime: 'CLAUDE'`. 3. **Geen git in de worktree buiten het groene pad** (`src/git/local-llm.ts`, met de bewaking in de helpers `maybeBackupPush` en `removeWorktreeForJob` en bij het wegruimen van bezetters): - geen backup-push; - opruimen via het bestandssysteem, gevolgd door `git worktree prune` vanuit de clone; - dit werkt ook als de worktree-root een symlink bevat. 4. **Worktree-aanmaak zonder repo-code:** - geen `prepare:worktree`; - een submodule-gate: de `.gitmodules` moet byte-gelijk zijn aan die op de default-branch, anders wordt de job FAILED, zonder rollback-lus; - veilige git-vlaggen (`core.hooksPath=/dev/null`, `core.fsmonitor=false` en de rest) op het groene pad: base_sha, diff, set-head, push met `--no-verify`, en de rev-parse na de push. 5. **`update_job_status`** slaat de auto-PR, `propagateStatusUpwards` en `cancelPbiOnFailure` over. ## Bewijs - `npm run typecheck && npm test`: 1862 passed / 51 skipped. De baseline op f51ee02 was 1816. - Markerproeven met een omgebogen gitlink naar git-administratie met `core.fsmonitor` en `core.sshCommand`: geen marker. De ketentest `update_job_status failed` gebruikt de echte git-helpers en `push.js`, plus een `execFile`-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_llm` dispatcht, heeft deze PR geen effect op bestaande jobs. De volgorde-eis uit het plan geldt: dispatch geen `local_llm`-taak voordat de nieuwe harness op max2 draait. Geen merge zonder JP. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
isLocalLlmWorktree miste een local_llm-bezetter wanneer de worktree-root
(SCRUM4ME_AGENT_WORKTREE_DIR of $HOME, bv. macOS' /tmp → /private/tmp) via
een symlink loopt: `git worktree list --porcelain` rapporteert het
gerealpathte pad, terwijl jobIdFromWorktreePath alleen het onopgeloste pad
vergeleek. Daardoor kon createWorktreeForJob alsnog `git worktree remove
--force` op een local_llm-bezetter draaien. jobIdFromWorktreePath vergelijkt
nu zowel het onopgeloste als het gerealpathte pad aan beide kanten.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Voor kind=TASK_IMPLEMENTATION jobs met required_capability='local_llm'
beheert de harness de taakstatus zelf en mergt de Claude-sessie de branch
met de hand. update_job_status slaat voor die jobs maybeCreateAutoPr,
propagateStatusUpwards en cancelPbiOnFailure over. Push bij done, de
verify-gate, de jobvelden en de antwoord-JSON blijven ongewijzigd; de
backup-push bij failed viel al weg via Taak 3 (branch-safety.ts).

Tests (nieuw __tests__/update-job-status-local-llm.test.ts):
- done+local_llm: geen auto-PR, geen doorwerking; status:'done' + pushed_at
- failed+local_llm: geen doorwerking, geen PBI-cascade
- keten-test met echte branch-safety/worktree/local-llm-modules en een
  omgebogen gitlink + fsmonitor/sshCommand-markers (Taak 3-fixture, nu
  niet-bare met core.worktree + positieve controle): failed levert
  status:'failed' zonder dat er ooit git in de worktree draait
- regressietests zonder local_llm: bestaand gedrag ongewijzigd

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test(update-job-status): ketentest detecteert git in de local_llm-worktree
Some checks failed
CI / Final merge attestation and immutable publication (pull_request) Has been skipped
CI / PR candidate (never published) (pull_request) Failing after 54s
9477167492
Review-bevinding (Important): de keten-test mockte git/push.js, dus een
weggehaalde isLocalLlmWorktree-guard in maybeBackupPush zou stoppen bij de
eerste ECHTE git-aanroep (rev-parse HEAD) — die zet geen van beide markers
(geen fsmonitor-trigger, geen netwerk). De marker-only-assertie was dus
groen met én zonder de guard: geen bewijs.

Twee onafhankelijke fixes, in een nieuw bestand
__tests__/update-job-status-local-llm-chain.test.ts (git/push.js hier ECHT,
i.t.t. het bestaande update-job-status-local-llm.test.ts dat push.js blijft
mocken voor de handler-conditietests):
- directe assertie op de node:child_process-spy dat geen enkele git-aanroep
  tijdens de handler-call een cwd binnen de worktree had (vangt ook kale
  rev-parse-aanroepen zonder marker);
- git/push.js niet langer gemockt in de ketentest, zodat een weggehaalde
  guard ook echt bij pushBranchForJob/resolveOriginDefaultRef uitkomt.

Mutatie-bewijs (guard tijdelijk weg, niet gecommit): de nieuwe cwd-assertie
faalt met 6 echte git-aanroepen in de worktree (rev-parse HEAD ×2,
tracking-ref, remote set-head --auto, symbolic-ref, rev-parse origin/main);
met de guard terug: groen. `git diff src/git/branch-safety.ts` bevestigt de
mutatie volledig teruggedraaid.

Minor: de vacuous findMany-assertie in de failed-test verwijderd (module was
al volledig gemockt) en de done-test controleert nu ook dat
prisma.claudeJob.update met een echte Date voor pushed_at wordt aangeroepen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
s4m-codex-reviewer requested changes 2026-09-27 23:26:36 +02:00
Dismissed
s4m-codex-reviewer left a comment

Verdict: REQUEST_CHANGES

  • BLOCKER — src/git/push.ts:53 (in combinatie met src/git/local-llm.ts:28): Een succesvolle local_llm-job draait nog steeds git remote set-head en git push met cwd in de door de container beschrijfbare worktree. SAFE_GIT_CONFIG schakelt core.sshCommand (noch de onbetrouwbare remote.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-verify voorkomt 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.

# Verdict: REQUEST_CHANGES - **BLOCKER — src/git/push.ts:53 (in combinatie met src/git/local-llm.ts:28):** Een succesvolle `local_llm`-job draait nog steeds `git remote set-head` en `git push` met `cwd` in de door de container beschrijfbare worktree. `SAFE_GIT_CONFIG` schakelt `core.sshCommand` (noch de onbetrouwbare `remote.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-verify` voorkomt 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.
Controller ruling P13 (whole-branch review, Opus, Important): attachWorktreeToJob
resolveRepoRoot met allowOnDemandClone: true voor élke job, ook local_llm. Zonder
SCRUM4ME_REPO_ROOT_* op de host viel dat terug op de ~/Projects/<name>-conventie
en cloneRepoOnDemand — repo-code + npm ci met lifecycle scripts op de host, in
strijd met de Global Constraint uit spec §6. Zonder resolvebare root liep
rollbackClaim de job bovendien eindeloos claim → fail → rollback rond.

resolveRepoRoot krijgt een nieuwe explicitRootsOnly-optie: uitsluitend env var /
~/.scrum4me-agent-config.json, nooit de ~/Projects-conventie of on-demand clone.
attachWorktreeToJob beslist via isLocalLlmJob(jobId) (DB, nooit de worktree) en
zet die optie voor local_llm-jobs. Resolvet er dan niets, dan gaat de job FAILED
zonder rollbackClaim — zelfde patroon als de bestaande LocalLlmWorktreeRefused-
afhandeling. Niet-lokale jobs zijn byte-identiek aan vóór deze wijziging.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(wait-for-job): local_llm task-route valt niet meer terug op de product-root zonder expliciete task-repo-root
Some checks failed
CI / Final merge attestation and immutable publication (pull_request) Has been skipped
CI / PR candidate (never published) (pull_request) Failing after 18s
6b9b7ca1f0
Re-review regressie op de P13-fix (7685d66): het task-niveau-pad in
resolveRepoRoot wrapte alleen de ~/Projects-conventie en de task-on-demand
clone in `if (!explicitRootsOnly)`, maar viel daarna onvoorwaardelijk door
naar stap 2/3 (product-env/product-config). Een local_llm-taak met
task.repo_url maar zonder SCRUM4ME_REPO_ROOT_REPO_<name> resolvede zo stil
naar de PRODUCT-root — een ander repo dan task.repo_url noemt, in strijd met
"a cross-repo task must run in ITS repo" uit het bestaande commentaar.

Fix: `if (explicitRootsOnly) return unresolved()` direct na de task-env/
task-config-checks, vóór de conventie-check. Niet-lokale jobs ongewijzigd.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
s4m-codex-reviewer requested changes 2026-09-28 02:31:20 +02:00
Dismissed
s4m-codex-reviewer left a comment

REQUEST_CHANGES

  • BLOCKER — src/git/local-llm.ts:29; src/git/push.ts:53. SAFE_GIT_CONFIG schakelt hooks en fsmonitor uit, maar overschrijft core.sshCommand (of de remote receive-pack/upload-pack-configuratie) niet. Een local_llm-container mag de .git-gitlink en config aanpassen; bij de daaropvolgende host-aanroep git push wordt een kwaadaardige core.sshCommand alsnog 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 markerende core.sshCommand afdekt.

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Teststatus: niet uitvoerbaar in de reviewcheckout; npm test stopt vóór Vitest omdat tsc ontbreekt (geen geïnstalleerde dependencies).

# REQUEST_CHANGES - **BLOCKER — src/git/local-llm.ts:29; src/git/push.ts:53.** `SAFE_GIT_CONFIG` schakelt hooks en fsmonitor uit, maar overschrijft `core.sshCommand` (of de remote receive-pack/upload-pack-configuratie) niet. Een `local_llm`-container mag de `.git`-gitlink en config aanpassen; bij de daaropvolgende host-aanroep `git push` wordt een kwaadaardige `core.sshCommand` alsnog 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 markerende `core.sshCommand` afdekt. Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. Teststatus: niet uitvoerbaar in de reviewcheckout; `npm test` stopt vóór Vitest omdat `tsc` ontbreekt (geen geïnstalleerde dependencies).
fix(local-llm): done-pad en verify draaien git alleen tegen een vertrouwde worktree-gitlink
Some checks failed
CI / Final merge attestation and immutable publication (pull_request) Has been skipped
CI / PR candidate (never published) (pull_request) Failing after 54s
e7aff3537f
Forgejo-review PR #169 (s4m-codex-reviewer, BLOCKER): een geslaagde
local_llm-job draaide `git remote set-head` en `git push` met cwd in de
container-beschrijfbare worktree. SAFE_GIT_CONFIG schakelt core.sshCommand
en een onvertrouwde remote.origin.url niet uit, dus een omgebogen
.git-gitlink liet de host de SSH-command van de container draaien.

- assertTrustedWorktreeGitlink (fs-only, nooit git): .git is een gewoon
  bestand met precies `gitdir: <pad>`; realpath(<pad>) ligt direct onder
  <repoRoot>/.git/worktrees; terugwijzer en commondir kloppen; geen
  symlinks in config.worktree/commondir/gitdir/HEAD; gitlink-clone als
  repo-root wordt geweigerd.
- assertTrustedLocalJobWorktree resolvet de clone zoals de claim
  (resolveRepoRoot met explicitRootsOnly, product/task.repo_url uit de DB).
- gitPrefixFor controleert dit voor elke local_llm-worktree vóór de git-
  aanroep: dekt push, set-head/symbolic-ref, post-push rev-parse, getGitDiff
  (verify_task_against_plan, verify_sprint_task) en de claim-rev-parse.
  Niet-lokale jobs: dezelfde DB-lookups, geen controle.
- prepareDoneUpdate: afgekeurde gitlink ⇒ FAILED met de gitlink-melding,
  geen push, geen auto-PR, geen cascade; worktree blijft staan.
- Tests: done-pad-ketentest met marker (RED op 6b9b7ca: ssh-marker ontstond),
  positieve push naar lokale bare remote, unit-tests per regel, verify-fout,
  niet-lokale job raakt de controle niet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
s4m-codex-reviewer left a comment

Verdict: APPROVED

Findings

  • Geen blokkerende of error-severity findings gevonden.

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.

## Verdict: APPROVED ### Findings - Geen blokkerende of error-severity findings gevonden. 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.
Author
Owner

Dank voor de BLOCKER. Hij klopt voor de MCP afzonderlijk bekeken: op het done-pad draaien git remote set-head en git push met de worktree als werkmap, en SAFE_GIT_CONFIG zet core.sshCommand niet 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):

  • Bij de claim legt de harness een snapshot vast van elk .git-item in de worktree: de worktree-gitlink, submodule-gitlinks en nieuwe .git-items, ook in node_modules.
  • Vóór elke host-git-aanroep vergelijkt de harness opnieuw met die snapshot. Een gewijzigd, nieuw of verdwenen item geeft failed zonder verdere git, ook niet via de MCP.
  • Tussen die scan en de push bij done draait geen container meer.

De spec noemt core.sshCommand daar 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 een local_llm-worktree (done-pad, verify_task_against_plan/getGitDiff, base_sha bij de claim) controleert gitPrefixFor via src/git/worktree-gitlink.ts de gitlink met alleen het bestandssysteem, zonder git:

  • <worktree>/.git is een regulier bestand;
  • de gitdir: wijst naar een direct kind van <clone>/.git/worktrees;
  • de back-pointer wijst terug naar deze worktree;
  • commondir wijst 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 FAILED met "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.

  • Regressietest van jouw scenario via de echte update_job_status-done-handler: de gitlink is omgebogen naar container-administratie met remote.origin.url=ssh://…, een core.sshCommand-marker en een core.fsmonitor-marker. Op 6b9b7ca ontstond de ssh-marker, na de fix niet; de job is FAILED en er draait geen git met de worktree als werkmap.
  • Positieve test: een niet-gemanipuleerde worktree doorloopt done en pusht naar een lokale bare remote.
  • Unit-tests per regel van de controle. Niet-local_llm-jobs blijven ongewijzigd; de controle wordt daar niet aangeroepen.
  • Gate: npm run typecheck && npm test, 1893 passed / 51 skipped.

core.sshCommand is bewust niet aan SAFE_GIT_CONFIG toegevoegd. 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

Dank voor de BLOCKER. Hij klopt voor de MCP afzonderlijk bekeken: op het done-pad draaien `git remote set-head` en `git push` met de worktree als werkmap, en `SAFE_GIT_CONFIG` zet `core.sshCommand` niet 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`): - Bij de claim legt de harness een snapshot vast van elk `.git`-item in de worktree: de worktree-gitlink, submodule-gitlinks en nieuwe `.git`-items, ook in `node_modules`. - Vóór elke host-git-aanroep vergelijkt de harness opnieuw met die snapshot. Een gewijzigd, nieuw of verdwenen item geeft `failed` zonder verdere git, ook niet via de MCP. - Tussen die scan en de push bij `done` draait geen container meer. De spec noemt `core.sshCommand` daar 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 een `local_llm`-worktree (done-pad, `verify_task_against_plan`/`getGitDiff`, `base_sha` bij de claim) controleert `gitPrefixFor` via `src/git/worktree-gitlink.ts` de gitlink met alleen het bestandssysteem, zonder git: - `<worktree>/.git` is een regulier bestand; - de `gitdir:` wijst naar een direct kind van `<clone>/.git/worktrees`; - de back-pointer wijst terug naar deze worktree; - `commondir` wijst 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 `FAILED` met "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.** - Regressietest van jouw scenario via de echte `update_job_status`-done-handler: de gitlink is omgebogen naar container-administratie met `remote.origin.url=ssh://…`, een `core.sshCommand`-marker en een `core.fsmonitor`-marker. Op 6b9b7ca ontstond de ssh-marker, na de fix niet; de job is `FAILED` en er draait geen git met de worktree als werkmap. - Positieve test: een niet-gemanipuleerde worktree doorloopt `done` en pusht naar een lokale bare remote. - Unit-tests per regel van de controle. Niet-`local_llm`-jobs blijven ongewijzigd; de controle wordt daar niet aangeroepen. - Gate: `npm run typecheck && npm test`, 1893 passed / 51 skipped. `core.sshCommand` is bewust niet aan `SAFE_GIT_CONFIG` toegevoegd. 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](https://claude.com/claude-code)
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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-mcp!169
No description provided.