feat(forge-credential): hatchmate working-repo key layer + 4 composite forks #3
Reference in New Issue
Block a user
Delete Branch "feat/hatchmate-per-project-fork-key"
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?
Context
M2-CRS W4 unblock. Agent jobs dispatched for the hatchmate project were failing to clone
hatchmate/hatchmate-agentsbecause the sharedgitea-ssh/v1context mounts theai_enablementdeploy key (scoped toskynet/*only). The same bug would hit every project whose working repo lives outside theskynetorg.This implements the per-org pattern the framework already uses for accelerators (
gitea-ssh-accelerators/v1) and homelab (gitea-ssh-homelab/v1).What
gitea-ssh-hatchmate/v1forge-credential context (mirrorsgitea-ssh-accelerators/v1)account_ref: "hatchmate.space:platform"write_targets: ["gitea.oreillyit.nz/hatchmate/*"]gitea.oreillyit.nz-hatchmate→ matched by the URLgit@gitea.oreillyit.nz-hatchmate:hatchmate/hatchmate-agents.gitcode-{fable,minimax,airouter,opus}-tdd-repo-hatchmate/v1/harness.yamlgitea-ssh/v1(for reference clones, skynet org) ANDgitea-ssh-hatchmate/v1(for working-repo clone + push)tests/invariants/test_forge_credentials_declare_write_targets.pyhadxfail(strict=True)but all 4 existing layers already declarewrite_targets→ wasXPASS-ing. Removed the marker so HC-11 is now a real positive gate (5 layers instead of 4).Verification
pytest tests/invariants/→ 7/7 passXPASS(strict)to a real pass21ef21f9-..., grantbc4c3375-..., K8s Secretacct-21ef21f9materialised)Companion CRS change
hatchmate-crs PR will route roles to the
-hatchmatecomposites and flipAGENT_REPO_URLto the per-org scp-form URL (git@gitea.oreillyit.nz-hatchmate:...) so SSH resolves to the right IdentityFile.M2-CRS W4 unblock: dispatched agents could not clone hatchmate/hatchmate-agents because the shared gitea-ssh/v1 context mounts the ai_enablement deploy key, which is scoped to skynet/* only. Same bug would hit every project whose working repo lives outside the skynet org. This implements the per-org pattern the framework already uses for accelerators (gitea-ssh-accelerators/v1) and homelab (gitea-ssh-homelab/v1): - harnesses/contexts/gitea-ssh-hatchmate/v1/{init.sh,harness.yaml} — NEW forge-credential context mirroring accelerators, with account_ref 'hatchmate.space:platform' and write_targets covering hatchmate/*. The init.sh stages the ESO-mounted private key to ~/.ssh/gitea-oreillyit-nz-hatchmate (matching the ssh alias declared in harness.yaml). URL host pattern 'gitea.oreillyit.nz-hatchmate' (per-org alias) drives SSH config block selection — already auto-written by harness_init.py from each layer's ssh_hosts: declarations. - harnesses/composites/code-*-tdd-repo-hatchmate/v1/ — NEW composites for fable/minimax/airouter/opus that compose BOTH gitea-ssh/v1 (for reference clones, skynet org) AND gitea-ssh-hatchmate/v1 (for working-repo clone + push, hatchmate org). Composites are unchanged for non-hatchmate projects. - tests/invariants/test_forge_credentials_declare_write_targets.py — the existing xfail(strict=True) marker was wrong: the 4 existing layers all declare write_targets today, so the test was XPASSing. Removed the xfail marker so HC-11 is now a real positive gate (5 layers instead of 4). This was a pre-existing test bug surfaced by the 5th layer. W4 next step: dispatcher's account_ref resolution needs the hatchmate CP account + grant to be created (via the new scripts/provision-hatchmate-fork-key.sh in the hatchmate app repo).