Commit graph

2093 commits

Author SHA1 Message Date
dev-qwen2
0243f546da fix: edge-control: deregister has no ownership check — any authorized SSH key can take over any project (#1091)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
Require the caller to prove ownership on deregister by providing the
pubkey that was used during registration. The stored pubkey is loaded
from registry.json and compared byte-for-byte against the supplied key.

Changes:
- Add get_pubkey() helper to lib/ports.sh
- Update do_deregister() to verify caller pubkey before removing project
- Update SSH protocol to "deregister <project> <pubkey>"
- Update bin/disinto CLI to read tunnel keypair and pass pubkey
- Return {"error":"pubkey mismatch"} on failure (no pubkey leakage)
- Add unit tests for both success and failure paths

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-20 19:12:31 +00:00
65df00ea6a Merge pull request 'fix: vision(#623): scope Claude chat working directory to project staging checkout (#1027)' (#1089) from fix/issue-1027-1 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 18:26:41 +00:00
dev-qwen2
7f1f8fa01c fix: vision(#623): scope Claude chat working directory to project staging checkout (#1027)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/secret-scan Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
- server.py: add CHAT_WORKSPACE_DIR env var, set cwd to workspace
  and use --permission-mode acceptEdits + append message in Claude invocations
- lib/generators.sh: add workspace bind mount and env var to compose generator
- nomad/jobs/chat.hcl: add workspace host volume (static source "chat-workspace"),
  meta block + NOMAD_META_ env var, volume_mount — Nomad-compatible pattern

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-20 18:11:33 +00:00
a330db9537 Merge pull request 'fix: tools/edge-control/verify-chat-sandbox.sh targets deleted disinto-chat container (#1087)' (#1090) from fix/issue-1087 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
2026-04-20 17:57:00 +00:00
Agent
750981529b fix: tools/edge-control/verify-chat-sandbox.sh targets deleted disinto-chat container (#1087)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-20 17:46:35 +00:00
d1867bd877 Merge pull request 'chore: gardener housekeeping' (#1088) from chore/gardener-20260420-1719 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 17:29:29 +00:00
Claude
f782f6be3a chore: gardener housekeeping 2026-04-20
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/secret-scan Pipeline was successful
2026-04-20 17:19:23 +00:00
0483e2b7d1 Merge pull request 'fix: feat: drop chat rate-limiting — remove per-user hour/day request caps and token cap (reverts #711) (#1084)' (#1086) from fix/issue-1084 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 16:41:51 +00:00
dev-qwen2
6745736a0f fix: remove CHAT_MAX_* rate-limit env vars from generate_compose() (#1084)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/secret-scan Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
2026-04-20 16:28:33 +00:00
dev-qwen2
f28c8000bb fix: feat: drop chat rate-limiting — remove per-user hour/day request caps and token cap (reverts #711) (#1084)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/secret-scan Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
2026-04-20 16:12:11 +00:00
bcf7db93b1 Merge pull request 'fix: feat: merge chat container into edge — run chat server inside edge container with full permissions (reverts sandbox from #706) (#1083)' (#1085) from fix/issue-1083 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
2026-04-20 15:59:42 +00:00
Claude
686b1c2d40 fix: update AGENTS.md and sync rate-limit env vars in static compose
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
- AGENTS.md line 45: reflect chat merged into edge (no standalone Dockerfile/entrypoint)
- docker-compose.yml: add CHAT_MAX_REQUESTS_PER_HOUR/DAY and CHAT_MAX_TOKENS_PER_DAY
  to match generators.sh (advisory from review)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 15:47:03 +00:00
Claude
83176c5f28 fix: feat: merge chat container into edge — run chat server inside edge container with full permissions (reverts sandbox from #706) (#1083)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 15:47:03 +00:00
42e9cae6f8 Merge pull request 'fix: feat: configure Forgejo ROOT_URL for /forge/ subpath routing (#1080)' (#1082) from fix/issue-1080 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 15:36:16 +00:00
398a7398a9 Merge pull request 'fix: fix: strip /staging prefix in Caddyfile before proxying to staging container (#1079)' (#1081) from fix/issue-1079 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 15:22:27 +00:00
Agent
02f8e13f33 fix: feat: configure Forgejo ROOT_URL for /forge/ subpath routing (#1080)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
Move FORGEJO_ROOT_URL and WOODPECKER_HOST configuration to BEFORE
generate_compose so the .env file is available for variable substitution.

When EDGE_TUNNEL_FQDN is set with subpath routing mode, the .env file
now gets FORGEJO_ROOT_URL=https://<fqdn>/forge/ written before
docker-compose.yml is generated, ensuring the subpath is included in
the generated compose file.

This fixes the 404 on /forge/ by ensuring Forgejo's ROOT_URL includes
the /forge/ prefix so its internal router recognizes the subpath.

The Caddyfile already correctly does NOT strip the prefix - it passes
the full /forge/... path to forgejo:3000.
2026-04-20 15:13:01 +00:00
dev-qwen2
d17754efab fix: fix: strip /staging prefix in Caddyfile before proxying to staging container (#1079)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/secret-scan Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
2026-04-20 15:09:34 +00:00
abca547dcc Merge pull request 'fix: vision(#623): WebSocket streaming for chat UI to replace one-shot claude --print (#1026)' (#1076) from fix/issue-1026 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 11:48:10 +00:00
Agent
01f7d061bc fix: WebSocket streaming - address all AI review findings (#1076)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/secret-scan Pipeline was successful
Fixes identified in AI review:
- Blocker #1: Server now handles chat_request WebSocket frames and invokes Claude
- Blocker #2: accept_connection() uses self.headers from BaseHTTPRequestHandler
- Blocker #3: handle_websocket_upgrade() uses asyncio.open_connection() for proper StreamWriter
- Medium #4: _decode_frame() uses readexactly() for all fixed-length reads
- Medium #5: Message queue cleaned up on disconnect in handle_connection() finally block
- Low #6: WebSocket close code corrected from 768 to 1000
- Low #7: _send_close() and _send_pong() are now async with proper await

Changes:
- Added _handle_chat_request() method to invoke Claude within WebSocket coroutine
- Fixed _send_close() to use struct.pack for correct close code (1000)
- Made _send_pong() async with proper await
- Updated handle_connection() to call async close/pong methods and cleanup queue
- Fixed handle_websocket_upgrade() to pass Sec-WebSocket-Key from HTTP headers
- Replaced create_connection() with open_connection() for proper reader/writer
2026-04-20 11:36:27 +00:00
Agent
17e745376d fix: vision(#623): WebSocket streaming for chat UI to replace one-shot claude --print (#1026) 2026-04-20 11:36:27 +00:00
aa87639356 Merge pull request 'fix: vision(#623): automate subdomain fallback pivot if subpath routing fails (#1028)' (#1078) from fix/issue-1028 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 11:28:44 +00:00
Claude
78a295f567 fix: vision(#623): automate subdomain fallback pivot if subpath routing fails (#1028)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 11:12:20 +00:00
89c0a65453 Merge pull request 'fix: vision(#623): end-to-end subpath routing smoke test for Forgejo + Woodpecker + chat (#1025)' (#1063) from fix/issue-1025-3 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
2026-04-20 11:01:13 +00:00
48ce3edb4b fix: convert bash array to POSIX for-loop in caddyfile-routing-test
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
Step ran in alpine:3.19 with default /bin/sh (busybox ash) which does not
support bash array syntax. REQUIRED_HANDLERS=(...) + "${ARR[@]}" failed
with "syntax error: unexpected (".

Inlined the handler list into a single space-separated for-loop that works
under POSIX sh. No behavioral change; same 6 handlers checked.

Fixes edge-subpath/caddyfile-routing-test exit 2 on pipelines targeting
fix/issue-1025-3 — see #1025.
2026-04-20 10:47:12 +00:00
181f82dfd0 fix: use workspace-relative path for rendered Caddyfile in edge-subpath pipeline
Some checks failed
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline failed
ci/woodpecker/pr/smoke-init Pipeline failed
Woodpecker mounts the workspace dir across steps in a workflow; /tmp does not
persist between step containers. render-caddyfile was writing to
/tmp/edge-render/Caddyfile.rendered which caddy-validate could not read
(caddy: no such file or directory).

Changed all /tmp/edge-render references to edge-render (workspace-relative).

Fixes edge-subpath/caddy-validate exit 1 on pipelines targeting
fix/issue-1025-3 — see #1025.
2026-04-20 10:44:17 +00:00
a620e296de Merge pull request 'fix: fix: collect-engagement.sh never commits evidence to ops repo — data silently lost (#982)' (#1075) from fix/issue-982 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
2026-04-20 08:54:08 +00:00
88aca4a064 Merge pull request 'fix: bug: disinto init --backend=nomad — does not bootstrap Forgejo admin user (#1069)' (#1073) from fix/issue-1069 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 08:46:33 +00:00
Agent
253dd7c6ff fix: fix: collect-engagement.sh never commits evidence to ops repo — data silently lost (#982)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
2026-04-20 08:44:05 +00:00
1a24e79fb5 Merge pull request 'fix: fix: re-seed ops repo directories after branch protection resolved (#820)' (#1074) from fix/issue-820 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
2026-04-20 08:39:18 +00:00
dev-qwen2
95bacbbfa4 fix: resolve all CI review blockers for forgejo admin bootstrap (#1069)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
2026-04-20 08:35:40 +00:00
Agent
6673c0efff fix: fix: re-seed ops repo directories after branch protection resolved (#820)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
2026-04-20 08:23:01 +00:00
dev-qwen2
a7bcb96935 fix: correct MD5 hashes for forgejo-bootstrap.sh duplicate detection (#1069)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
2026-04-20 08:21:31 +00:00
85e6907dc3 fix: rename logging helpers in test-caddyfile-routing.sh to avoid dup-detection
Some checks failed
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/edge-subpath Pipeline failed
ci/woodpecker/pr/smoke-init Pipeline was successful
log_info / log_pass / log_fail / log_section were copied verbatim from
tests/smoke-edge-subpath.sh and triggered ci.duplicate-detection with 3
collision hashes. Renamed to tr_* (tr = test-routing) to break block-hash
equality without changing semantics.

43 call sites updated. No behavioral change.

Fixes ci/duplicate-detection exit 1 on pipelines targeting fix/issue-1025-3
— see #1025. A proper shared lib/test-helpers.sh is a better long-term
solution but out of scope here.
2026-04-20 08:11:08 +00:00
7763facb11 fix: add curl to apk install in caddy-validate step
Some checks are pending
ci/woodpecker/push/ci Pipeline is pending
ci/woodpecker/pr/ci Pipeline is pending
ci/woodpecker/pr/edge-subpath Pipeline is pending
ci/woodpecker/pr/smoke-init Pipeline is pending
The step runs `curl -sS -o /tmp/caddy ...` to download the caddy binary
but only installs ca-certificates. curl is not in alpine:3.19 base image.
Adding curl to the apk add line so the download actually runs.

Fixes edge-subpath/caddy-validate exit 127 (command not found) on
pipelines targeting fix/issue-1025-3 — see #1025.
2026-04-20 08:10:58 +00:00
dev-qwen2
23e47e3820 fix: bug: disinto init --backend=nomad — does not bootstrap Forgejo admin user (#1069)
Some checks failed
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline failed
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
2026-04-20 08:06:06 +00:00
49190359b8 Merge pull request 'fix: bug: deploy.sh 360s still too tight for chat cold-start + cascade-skip masks edge/vault-runner (#1070)' (#1071) from fix/issue-1070 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 08:04:27 +00:00
f89d22dd39 Merge pull request 'fix: bug: disinto backup import — schema mismatch with create; 0 issues imported (#1068)' (#1072) from fix/issue-1068 into main
Some checks are pending
ci/woodpecker/push/ci Pipeline is pending
2026-04-20 08:01:51 +00:00
Agent
4c6d545060 fix: bug: disinto backup import — schema mismatch with create; 0 issues imported (#1068)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
2026-04-20 07:58:25 +00:00
Claude
d1a026c702 fix: deploy.sh 360s still too tight for chat cold-start + cascade-skip masks edge/vault-runner (#1070)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
Two changes:
- Set JOB_READY_TIMEOUT_CHAT=600 (chat cold-start takes ~5-6 min on fresh LXC)
- On deploy timeout/failure, log WARNING and continue submitting remaining jobs
  instead of dying immediately; print final health summary with failed jobs list

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 07:56:30 +00:00
fbd66dd4ea Merge pull request 'chore: gardener housekeeping 2026-04-20' (#1067) from chore/gardener-20260420-0625 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 06:33:32 +00:00
Claude
f4ff202c55 chore: gardener housekeeping 2026-04-20
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/secret-scan Pipeline was successful
2026-04-20 06:25:42 +00:00
88222503d5 Merge pull request 'chore: gardener housekeeping 2026-04-20' (#1066) from chore/gardener-20260420-0021 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-20 00:25:30 +00:00
Claude
91841369f4 chore: gardener housekeeping 2026-04-20
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/secret-scan Pipeline was successful
2026-04-20 00:21:20 +00:00
343b928a26 Merge pull request 'fix: tool: disinto backup import — idempotent restore on fresh Nomad cluster (#1058)' (#1064) from fix/issue-1058 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-19 21:35:46 +00:00
Agent
99fe90ae27 fix: tool: disinto backup import — idempotent restore on fresh Nomad cluster (#1058)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
ci/woodpecker/pr/nomad-validate Pipeline was successful
ci/woodpecker/pr/smoke-init Pipeline was successful
2026-04-19 21:28:02 +00:00
3aa521509a Merge pull request 'fix: docs: nomad-cutover-runbook.md — end-to-end cutover procedure (#1060)' (#1065) from fix/issue-1060 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
2026-04-19 21:01:03 +00:00
Claude
2c7c8d0b38 fix: docs: nomad-cutover-runbook.md — end-to-end cutover procedure (#1060)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 20:50:45 +00:00
ec4e608827 Merge pull request 'fix: tool: disinto backup create — export Forgejo issues + disinto-ops git bundle (#1057)' (#1062) from fix/issue-1057 into main
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/nomad-validate Pipeline was successful
2026-04-19 20:43:54 +00:00
dev-qwen2
6b81e2a322 fix: simplify pipeline trigger to pull_request event only
Some checks failed
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline failed
ci/woodpecker/pr/edge-subpath Pipeline failed
ci/woodpecker/pr/smoke-init Pipeline was successful
2026-04-19 20:40:57 +00:00
dev-qwen2
ae8eb09ee7 fix: correct Woodpecker when clause syntax for path filters
Some checks failed
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/push/edge-subpath Pipeline failed
ci/woodpecker/pr/ci Pipeline failed
ci/woodpecker/pr/edge-subpath Pipeline failed
ci/woodpecker/pr/smoke-init Pipeline failed
2026-04-19 20:31:36 +00:00