Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .github/ISSUE_TEMPLATE/agent_integration.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Agent integration problem
description: You are building an agent against the Quorum Agent API and something is in your way
labels: ["agent-api", "dx"]
body:
- type: markdown
attributes:
value: |
The Agent API is Quorum's most important public surface. If it fought you, that
is a bug in the product even when the code is behaving as designed.

**Before filing:** Quorum only dials **public HTTPS** endpoints. A local agent
needs a tunnel — `cloudflared tunnel --url http://localhost:8787` or
`ngrok http 8787` — then paste the `https://` URL it prints.

- type: dropdown
id: stage
attributes:
label: Where did it go wrong
options:
- Connecting the agent (the "Connect an agent" card)
- Verifying the X-Quorum-Signature header
- Reading the turn payload
- Shaping my response (messages / operations)
- My operations never appeared on the board
- My agent got marked degraded
- Retries, timeouts, or duplicate turnIds
- The docs said one thing and the product did another
validations:
required: true

- type: textarea
id: expected
attributes:
label: What you expected, and what happened
description: Quote the doc or snippet you were following, if there was one.
validations:
required: true

- type: dropdown
id: language
attributes:
label: Language / runtime
options: [Node, Python, Go, Rust, Ruby, PHP, Java, Other]
validations:
required: true

- type: input
id: mode
attributes:
label: Integration mode
placeholder: "webhook or direct model"
validations:
required: true

- type: textarea
id: payload
attributes:
label: Turn payload or response involved
description: >
**Redact your signing secret and any API key.** Ids (`trn_`, `brd_`, `agt_`) are
safe to include and help us trace it.
render: json
66 changes: 66 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Bug report
description: Something in Quorum behaves differently than it should
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for reporting. If this is a **security** issue, close this and use
[private reporting](https://github.com/muthanii/quorum/security/advisories/new)
instead — see [SECURITY.md](../blob/main/SECURITY.md).

- type: textarea
id: what-happened
attributes:
label: What happened
description: What you saw, and what you expected instead.
placeholder: |
I clicked "Connect an agent" with a valid HTTPS URL and…
validations:
required: true

- type: textarea
id: repro
attributes:
label: Steps to reproduce
description: Numbered steps. A board id or a screenshot helps a lot.
placeholder: |
1. pnpm dev
2. Open http://localhost:3000 and click New board
3. …
validations:
required: true

- type: dropdown
id: area
attributes:
label: Which part
options:
- Board / canvas / artifacts
- Chat and @mentions
- Consensus (proposals, votes, quorum)
- Agent connect / agent turns
- Realtime sync or presence
- Auth, invites, or sharing
- Setup / local dev / CI
- Not sure
validations:
required: true

- type: textarea
id: logs
attributes:
label: Console or server output
description: >
Browser console errors and the relevant `pnpm dev` output. **Redact secrets** —
never paste `AUTH_SECRET`, `CREDENTIALS_ENCRYPTION_KEY`, or an agent signing
secret.
render: shell

- type: input
id: env
attributes:
label: Environment
placeholder: "Node 22.14, pnpm 9.15.4, Chrome 141, macOS 15 / Ubuntu 24.04 / WSL2"
validations:
required: true
10 changes: 10 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
blank_issues_enabled: true
contact_links:
- name: Report a security vulnerability
url: https://github.com/muthanii/quorum/security/advisories/new
about: >
Never open a public issue for a security problem. Private reporting reaches the
maintainers directly. See SECURITY.md for what is in scope.
- name: Ask a question or share what you built
url: https://github.com/muthanii/quorum/discussions
about: Questions, ideas, and agents you have connected. Not sure it is a bug? Start here.
35 changes: 35 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Feature request
description: Suggest something Quorum should do
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Worth knowing before you write: Quorum is deliberately **not** an agent-building
platform, a workflow/DAG builder, or an enterprise admin console, and it is not
offline-first. Those are stated non-goals, so proposals in that direction are
likely to be declined regardless of quality.

- type: textarea
id: problem
attributes:
label: What problem are you hitting
description: Describe the situation, not the solution. What were you trying to do?
validations:
required: true

- type: textarea
id: proposal
attributes:
label: What you would like instead
validations:
required: true

- type: textarea
id: principles
attributes:
label: How it fits the product principles
description: >
Quorum holds six: zero setup, everything on screen, unanimous by default, real
time or it doesn't count, one-click sharing, and lightweight (<250KB gzipped
initial JS). Which does this serve, and does it strain any of them?
29 changes: 29 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<!--
Explain why, not what — the diff already shows what. If this fixes an issue,
put "Fixes #123" somewhere in the body.
-->

## What changed and why

## How it was verified

<!-- Commands you ran, what you clicked, what you measured. "Tests pass" alone is thin. -->

## Checklist

- [ ] `pnpm typecheck && pnpm lint && pnpm test` all pass
- [ ] `pnpm test:e2e` passes, or this change cannot affect it
- [ ] New exported function in `packages/shared` or `lib/consensus` has a unit test
- [ ] Bug fix has a regression test that fails without the fix
- [ ] No agent credential is logged, echoed, or returned anywhere
- [ ] No change bypasses the consensus pipeline

## Needs a maintainer's sign-off before merge

<!-- Tick anything that applies. Each of these is an "ask first" item in CLAUDE.md. -->

- [ ] Adds a dependency
- [ ] Changes the Y.Doc schema (live docs exist and cannot be recreated)
- [ ] Changes the agent protocol (`packages/agent-protocol`)
- [ ] Adds a new top-level route
- [ ] Changes anything in the consensus engine or `doc-guard`
68 changes: 68 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Changelog

Notable changes to Quorum. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
this project has not cut a tagged release yet, so everything sits under Unreleased.

The **Agent Protocol** is versioned separately and independently — see
[Agent protocol compatibility](#agent-protocol-compatibility) at the bottom. Changes to
the app do not imply a protocol change.

## [Unreleased]

### Added

- Rate limiting on the public REST surface (board creation, agent connect, invites,
board token, invite accept) and on agent turns in the ws server, both backed by Redis.
A refused turn posts a visible system message in the board chat rather than vanishing.
- `RATE_LIMIT_<BUCKET>` env overrides, so a deployment can tune a ceiling without a code
change. Absent, non-numeric, or non-positive values keep the shipped default.
- Deploy topology: `vercel.json`, Dockerfiles and `fly.toml` for ws and worker, and
`DEPLOYING.md` covering why ws cannot run on Vercel and must stay a single machine.
- `WS_INTERNAL_URL` so the worker can reach the ws internal API when they are on
separate hosts. Without it, turns ran and then silently failed to post results back.
- A branded `/signin` page replacing Auth.js's built-in one, and a branded 404.
- A chat notice when an agent transitions to `degraded`, so @mentions that will not be
delivered are explained rather than dropped in silence.
- `CONTRIBUTING.md`, `SECURITY.md`, `CODE_OF_CONDUCT.md`, issue and PR templates.
- Tunnel instructions for connecting a locally-running agent.

### Fixed

- **`pnpm dev` could not start from a fresh clone.** The documented `cp .env.example .env`
produced a root `.env` that nothing loaded — Next resolves `.env` relative to
`apps/web`, and `tsx` loaded none. Every route returned 500.
- **CI had never passed.** `pnpm/action-setup@v4` rejects a `version` input that
disagrees with `package.json`'s `packageManager` pin, so the job died before install
on every run since CI was added. typecheck, lint, test and build had never executed.
- **The e2e suite became unrunnable** once rate limiting landed: 18 self-seeding specs
across 4 workers exhausted a 10/min board-creation budget and 8 failed with `429`.
- **The 7th artifact on a board spawned invisibly** underneath the 1st. Both axes
cascaded on `count % 6`, so artifact #7 landed on identical coordinates.
- **`/api/auth/signin` rendered a blank page** when no OAuth provider was configured,
which is the documented default.
- **Open redirect** in the new sign-in page's `callbackUrl` handling: a leading `/` is
not sufficient, since browsers read `//evil.example` as protocol-relative.
- A mistyped board URL fell through to Next's unbranded 404 with no way back.
- Agent endpoint errors named the rule but not the remedy, stranding anyone running an
agent locally.

### Security

- Agent endpoint validation is two-layer: a DNS-free syntactic gate at registration, and
full DNS-resolving SSRF enforcement in the worker at dial time, covering IPv4-mapped
and NAT64-embedded IPv6 forms.
- Rate limits fail open with a structured warning when Redis is unreachable.

## Agent protocol compatibility

The wire contract lives in `packages/agent-protocol/src/v1/`. Shapes under `v1/` never
change incompatibly. New optional fields may be added and new `trigger.type` or
proposal `kind` values may appear without a version bump — **agents must ignore fields
and enum values they do not recognise.**

A breaking change would ship as `v2/` alongside `v1/`, with `v1/` supported for at least
one release cycle after `v2/` is announced.

| Protocol | Status | Notes |
| -------- | ------- | --------------------------------------------------------------------------- |
| `v1` | Current | Initial contract: turn payload, agent response, HMAC-SHA256 request signing |
52 changes: 52 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Code of Conduct

## Our pledge

We as members, contributors, and maintainers pledge to make participation in this
project a harassment-free experience for everyone, regardless of age, body size, visible
or invisible disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation.

## Our standards

Behaviour that helps:

- Being kind and respectful to other people
- Taking disagreement as being about the work, not the person
- Giving and gracefully accepting constructive feedback
- Owning our mistakes, apologising, and learning from them
- Optimising for what is best for the project overall

Behaviour that is not acceptable:

- Sexualised language or imagery, and sexual attention or advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address, without
their explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional
setting

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behaviour may be reported to
the maintainers through
[GitHub private reporting](https://github.com/muthanii/quorum/security/advisories/new)
or by opening a confidential discussion with a maintainer. All complaints will be
reviewed and investigated promptly and fairly.

Maintainers are responsible for clarifying and enforcing these standards and will take
appropriate and fair corrective action in response to any behaviour they deem
inappropriate, threatening, offensive, or harmful. Maintainers have the right and
responsibility to remove, edit, or reject comments, commits, code, issues, and other
contributions that are not aligned to this Code of Conduct, and will communicate reasons
for moderation decisions when appropriate.

All maintainers are obligated to respect the privacy and security of the reporter of any
incident.

## Attribution

Adapted from the [Contributor Covenant](https://www.contributor-covenant.org/),
version 2.1.
Loading
Loading