docs(adr): ADR-017 autonomous swarm security model #24

Merged
navigator merged 1 commit from feature/adr-017-swarm-security into main 2026-05-24 15:11:12 -03:00
Owner

Summary

Records the trust boundary and operational limits of the FluidPop autonomous swarm before it goes live. Status: Proposed — flips to Accepted once Marcos approves via Telegram.

The ADR covers:

  • Trust boundary — anyone with write access to Fluid org ≈ shell access to navigator on the agent host. The swarm amplifies execution rate, not surface.
  • Author identity — all swarm commits author as FluidPop Swarm <swarm@pop.coop>; reviewer remains fluidpop-bot. Branch protection (author ≠ reviewer) holds.
  • Whitelist of accepted authors per role (Dispatcher only acts on navigator/fluidpop-bot/FluidPop Swarm issues; Approver only merges ^auto/ PRs from FluidPop Swarm/navigator).
  • Off-limits paths.git/hooks/pre-commit (installed by install-swarm.sh) rejects any swarm-authored commit touching infra/forgejo/**, .forgejo/workflows/**, infra/ops/agents/**, infra/ops/{telegram-claude-bridge,notify-telegram,runner-monitor}.*, docs/decisions/ADR-0??.md (when Accepted), LICENSE.md, CHANGELOG.md, PLAN.md.
  • CapsMAX_CONCURRENT_RESOLVERS=2, 6 merges/h, 12 open queued issues, 4h resolver wall-clock, circuit breaker 5×30min.
  • Escalation tripwire — post-mortem parser scans stream.jsonl for any tool call touching off-limits paths → quarantine + high-pri Telegram.
  • Revocation/swarm pause all via Telegram; full stop via uninstall-swarm.sh; token rotation under 10 min RTO.

Governance hold

This PR touches docs/decisions/. The PR Approver will not auto-merge it — instead it pings Telegram high and waits for human-approved label.

To approve from phone: reply to the bridge with approve PR 24 (the bridge labels it, next Approver tick merges).

Test plan

  • Marcos reads ADR and confirms blast-radius wording is acceptable
  • If acceptable: apply human-approved via Telegram reply, merge proceeds
  • Future PRs #25-#27 land the implementation (lib + roles + install hooks)
## Summary Records the trust boundary and operational limits of the FluidPop autonomous swarm before it goes live. Status: **Proposed** — flips to **Accepted** once Marcos approves via Telegram. The ADR covers: - **Trust boundary** — anyone with write access to `Fluid` org ≈ shell access to `navigator` on the agent host. The swarm amplifies execution *rate*, not *surface*. - **Author identity** — all swarm commits author as `FluidPop Swarm <swarm@pop.coop>`; reviewer remains `fluidpop-bot`. Branch protection (author ≠ reviewer) holds. - **Whitelist of accepted authors** per role (Dispatcher only acts on `navigator`/`fluidpop-bot`/`FluidPop Swarm` issues; Approver only merges `^auto/` PRs from `FluidPop Swarm`/`navigator`). - **Off-limits paths** — `.git/hooks/pre-commit` (installed by `install-swarm.sh`) rejects any swarm-authored commit touching `infra/forgejo/**`, `.forgejo/workflows/**`, `infra/ops/agents/**`, `infra/ops/{telegram-claude-bridge,notify-telegram,runner-monitor}.*`, `docs/decisions/ADR-0??.md` (when Accepted), `LICENSE.md`, `CHANGELOG.md`, `PLAN.md`. - **Caps** — `MAX_CONCURRENT_RESOLVERS=2`, 6 merges/h, 12 open queued issues, 4h resolver wall-clock, circuit breaker 5×30min. - **Escalation tripwire** — post-mortem parser scans `stream.jsonl` for any tool call touching off-limits paths → quarantine + high-pri Telegram. - **Revocation** — `/swarm pause all` via Telegram; full stop via `uninstall-swarm.sh`; token rotation under 10 min RTO. ## Governance hold This PR touches `docs/decisions/`. The PR Approver will not auto-merge it — instead it pings Telegram `high` and waits for `human-approved` label. To approve from phone: reply to the bridge with `approve PR 24` (the bridge labels it, next Approver tick merges). ## Test plan - [ ] Marcos reads ADR and confirms blast-radius wording is acceptable - [ ] If acceptable: apply `human-approved` via Telegram reply, merge proceeds - [ ] Future PRs #25-#27 land the implementation (lib + roles + install hooks)
docs(adr): ADR-017 autonomous swarm security model
All checks were successful
build / scalafmt-check (pull_request) Successful in 3s
build / sbt-compile (pull_request) Successful in 3s
build / shell-lint (pull_request) Successful in 8s
build / scalafmt-check (push) Successful in 3s
build / sbt-compile (push) Successful in 3s
build / shell-lint (push) Successful in 9s
d82ac7d35d
Records the trust boundary, accepted-author whitelist, off-limits paths,
caps, and escalation tripwire for the 4-role autonomous swarm
(Operator, Issue Opener, Resolver Dispatcher, PR Approver) that will be
installed in subsequent PRs.

Status: Proposed. Flips to Accepted once Marcos confirms via Telegram
(reply "approve PR <N>" applies the human-approved label that the PR
Approver gates governance-path merges on).

Cross-link: ADR-016 (bot reviewer identity), FUTURE ADR-018 (resolver
sandbox), FUTURE ADR-019 (server-side push block).
fluidpop-bot approved these changes 2026-05-24 15:09:56 -03:00
Dismissed
fluidpop-bot left a comment
Collaborator

CI green (head d82ac7d35d), auto-approving

CI green (head d82ac7d35d69b50d1fbf17494c97396a9087eec2), auto-approving
navigator force-pushed feature/adr-017-swarm-security from d82ac7d35d
All checks were successful
build / scalafmt-check (pull_request) Successful in 3s
build / sbt-compile (pull_request) Successful in 3s
build / shell-lint (pull_request) Successful in 8s
build / scalafmt-check (push) Successful in 3s
build / sbt-compile (push) Successful in 3s
build / shell-lint (push) Successful in 9s
to a4b6720a8c
All checks were successful
build / scalafmt-check (push) Successful in 4s
build / sbt-compile (push) Successful in 4s
build / shell-lint (push) Successful in 19s
build / scalafmt-check (pull_request) Successful in 3s
build / sbt-compile (pull_request) Successful in 4s
build / shell-lint (pull_request) Successful in 12s
2026-05-24 15:10:05 -03:00
Compare
fluidpop-bot left a comment
Collaborator

CI green (head a4b6720a8c), auto-approving

CI green (head a4b6720a8cffe33b84702bfa989e9e95b1ed132c), auto-approving
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
Fluid/fluidpop-v1!24
No description provided.