mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-13 07:12:00 +01:00
## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work > - Contributors and agents read the docs under `doc/` before they change code > - `doc/SPEC.md` and `doc/SPEC-implementation.md` were out of date. `doc/SPEC-implementation.md` became an append-only log: in 60 days it got about 1,645 new lines and lost 181, across 140 commits > - #20557 changed `AGENTS.md` so the code and its tests are the source of truth, and the specs are only background > - This pull request removes the two spec docs. It moves only the sections that live code comments cite into focused docs, and it repoints all other references > - The benefit is one less stale document that agents read and append to ## Linked Issues or Issue Description Refs #20557 (merged). This PR is the follow-up that removes the docs. It is based on `master`, which already contains #20557. **Issue type** Outdated content. The docs are out of date and conflict with the code. **Where is the issue?** `doc/SPEC.md`, `doc/SPEC-implementation.md`, and the code comments and docs that cite them. **What's wrong?** `doc/SPEC.md` and `doc/SPEC-implementation.md` are out of date, but agents still read them and append a paragraph with each fix. **Suggested fix** Delete both files. Move the sections that code cites into focused docs. Repoint the references. ## What Changed - Deleted `doc/SPEC.md` and `doc/SPEC-implementation.md`. - Moved these spec sections, because live code comments cite them: - §9.3.1 "Shared default-open issue writes" → new section in `doc/agent-permission-defaults.md`. - §9.8.1 "Issue-thread interaction resolver contract" → `doc/execution-semantics.md`, "Issue-thread interaction resolution". That section already had most of the contract. I added only the missing parts: the `supersedeOnUserComment` default, the canonical policy list, the addressee and cap rules, the rule that surfaces show the server's effective audience, and the cross-issue budget charge. The short policy summary at the top of the section now points to the list, so the definitions occur one time only. - §9.9 "Task Watchdog Authority Contract" → new "Authority contract" section in `doc/TASK-WATCHDOG.md`. It holds the allowed and disallowed mutation lists and the deferred capabilities. The atomic recovery batch, restoration verification, and interaction rules were already in `doc/execution-semantics.md` §11, so the new section links there and does not repeat them. I did not move the "Downstream acceptance criteria" checklist or the sentence about the CTO and Security sign-off. These were implementation-time notes; the tests now hold that coverage. - §9.10 "Company Skill Policy Contract" → new `doc/company-skill-policy.md`. No focused doc had this contract. I did not move the "Required regression tests" phase checklist. - Did not move any other part of the specs. - Repointed code comments that cited spec sections: - `packages/shared/src/issue-write-denial.ts` (§9.3) → `doc/agent-permission-defaults.md` - `server/src/routes/issues.ts` (§9.9) → `doc/TASK-WATCHDOG.md`, "Authority contract" - `server/src/routes/issues.ts` (§9.3, §9.8.1 cross-issue budget) → `doc/agent-permission-defaults.md` - `ui/src/lib/interaction-audience.ts` and `ui/src/components/InteractionGovernancePanel.tsx` (§9.8.1) → `doc/execution-semantics.md` - `ui/src/lib/skill-policy-denial.ts`, `ui/src/pages/CompanySkills.tsx`, `ui/src/pages/CompanySkills.production.tsx`, `ui/src/pages/SkillStudio.tsx` (§9.10) → `doc/company-skill-policy.md` - `server/src/services/recovery/ownership-invariant-report.ts` (monitor deadline wait path) → `doc/execution-semantics.md` §8. That section already lists the one-shot monitor as a valid wait path. - Resynced the git blob pin for `packages/shared/src/issue-write-denial.ts` in `tests/runner-e2e/source-sdk-public-inputs.json`. The comment edit changed the file's hash, and the Runner support suite checks that pin. I used `node tests/runner-e2e/source-sdk-public-inputs.mjs <HEAD> --write`; only that one pin changed. - Updated `AGENTS.md` §1 so it does not name the deleted files. - Removed the links to the deleted files from `doc/plugins/PLUGIN_SPEC.md`. - Updated the `doc-maintenance` agent skill (`.agents/skills/doc-maintenance/`) so it no longer audits or stages `doc/SPEC.md`. - Removed or replaced references in `maps/README.md`, `maps/feature-map/README.md`, `maps/storybook-map/README.md`, `doc/PRODUCT.md`, `doc/CLIPHUB.md`, `doc/DEPLOYMENT-MODES.md`, `doc/DEVELOPING.md`, `doc/evals.md`, `doc/spec/agent-runs.md`, `doc/AGENTCOMPANIES_SPEC_INVENTORY.md`, `doc/connections/CONNECTOR-PLAYBOOK.md`, `doc/plugins/ideas-from-opencode.md`, `doc/execution-semantics.md`, `doc/TASK-WATCHDOG.md`, and `.devin/wiki.json`. - In `doc/execution-semantics.md`, the "admission is independent of cleanup and accounting" reference now states the rule inline: only a hard stop, an explicit pause, or an inactive company refuses admission. - Kept these references as they are: dated plans in `doc/plans/` and `docs/plans/`, the dated log `doc/logs/2026-05-24-cli-api-parity-e2e-log.md`, `releases/`, the transcript fixture `ui/src/fixtures/runTranscriptFixtures.ts` (it uses the filename only as sample text), and `docs/specs/external-task-protocol.md` (it refers to the Symphony project's own `SPEC.md`). ## Verification - `git grep -n "SPEC-implementation\|SPEC\.md"` (without `releases/`, and ignoring `PLUGIN_SPEC.md` citations) finds only the kept references listed above. - `grep -rn "§9\.\(3\|8\|9\|10\)" ui/src server/src packages/shared/src` finds no results. - `node scripts/check-maps.mjs`: "Maps aligned: 35 areas, 192 capability IDs". - `pnpm check:token-gates`: "All gates clean". - `pnpm exec vitest run --config tests/runner-e2e/vitest.config.ts tests/runner-e2e/source-sdk-public-type.test.ts tests/runner-e2e/source-sdk-evidence.test.ts`: 45 passed. These failed in CI before the pin resync. - `pnpm verify`: exit 2 ("Broader verification required") because `AGENTS.md` is a global CI input. Required CI supplies the broad coverage for this revision. - All code changes are comments only. No runtime behavior changes. The title uses `refactor:` because comments in source files changed. ## Risks - Low risk. The change removes docs and edits comments only. - A reader can lose context from spec sections that I did not move. The text stays in git history. The code and its tests are the source of truth. - External links to the two deleted files will return 404. > For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`. ## Model Used - Anthropic Claude Opus 5.5 (`claude-opus-5-5`), in Claude Code with tool use (shell, file edits). Standard context window. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass (focused checks above; CI supplies broad coverage) - [x] I have added or updated tests where applicable (not applicable: docs and comments only) - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [ ] All Paperclip CI gates are green - [ ] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
215 lines
9.9 KiB
Markdown
215 lines
9.9 KiB
Markdown
# AGENTS.md
|
|
|
|
Guidance for human and AI contributors working in this repository.
|
|
|
|
This codebase is yours: what it's for and how it's built are your call, and you'll keep building on it.
|
|
The invariants and rules below record what has been decided so far. If you think one of them is wrong, say so and propose the change; do not work around it.
|
|
|
|
## 1. Purpose
|
|
|
|
Paperclip is a control plane for AI-agent companies.
|
|
The code and its tests are the source of truth for current behavior.
|
|
The focused docs under `doc/` are background. They can be out of date, so do not treat them as requirements when they disagree with the code or with the task.
|
|
|
|
## 2. Read This First
|
|
|
|
Read the doc that matches your change before you start:
|
|
|
|
| Your change touches | Read |
|
|
| --- | --- |
|
|
| Product behavior or scope | `doc/GOAL.md`, `doc/PRODUCT.md` |
|
|
| Setup, commands, testing, worktrees | `doc/DEVELOPING.md` |
|
|
| Schema, migrations, DB clients | `doc/DATABASE.md` |
|
|
| An Apps catalog connection | `doc/connections/CONNECTOR-PLAYBOOK.md` (the canonical connection authoring runbook) |
|
|
| Anything under `ui/` | `DESIGN.md` |
|
|
|
|
### Scoped repository rules
|
|
|
|
`rules/*.mdc` holds the architecture rules that reviewers apply to a pull
|
|
request. Each file starts with a short header: `description` is a one-sentence
|
|
summary of the rule, `globs` lists the files it covers, and `alwaysApply: true`
|
|
means it covers the whole repository.
|
|
|
|
You do not need to read the rule bodies before every change. List the headers to
|
|
see which rules exist and what each one asks for:
|
|
|
|
```sh
|
|
grep -E '^(description|globs|alwaysApply):' rules/*.mdc
|
|
```
|
|
|
|
Write the change so that it satisfies the descriptions of the rules that cover
|
|
your files. Read the full body of a rule only in these cases:
|
|
|
|
- You are making a design decision in the area the rule covers, such as adding a
|
|
module, a background worker, or persisted state.
|
|
- The description does not tell you whether your change complies.
|
|
- A reviewer cites the rule.
|
|
|
|
These rules supplement this file and any applicable nested `AGENTS.md`
|
|
instructions. See [`rules/README.md`](rules/README.md) for rule authoring and
|
|
Greptile setup.
|
|
|
|
## 3. Repo Map
|
|
|
|
- `server/`: Express REST API and orchestration services
|
|
- `ui/`: React + Vite board UI
|
|
- `packages/db/`: Drizzle schema, migrations, DB clients
|
|
- `packages/shared/`: shared types, constants, validators, API path constants
|
|
- `packages/adapters/`: agent adapter implementations (Claude, Codex, Cursor, etc.)
|
|
- `packages/adapter-utils/`: shared adapter utilities
|
|
- `packages/plugins/`: plugin system packages
|
|
- `packages/skills-catalog/`: app-shipped skills catalog (`@paperclipai/skills-catalog`)
|
|
- `packages/teams-catalog/`: app-shipped teams catalog (`@paperclipai/teams-catalog`)
|
|
- `cli/`: `paperclipai` CLI package (published bin, agent-facing commands)
|
|
- `skills/`: Paperclip runtime/operational skills (not part of the app catalog)
|
|
- `doc/`: operational and product docs
|
|
- `doc/plans/`: dated repo plan docs, named `YYYY-MM-DD-slug.md`. A plan for a Paperclip issue goes in the issue's `plan` document instead.
|
|
- `rules/`: scoped repository rules (see section 2)
|
|
|
|
## 4. Dev Setup
|
|
|
|
```sh
|
|
node scripts/agent-preflight.mjs # prepare a new or updated worktree
|
|
pnpm dev # API and UI at http://localhost:3100
|
|
```
|
|
|
|
Leave `DATABASE_URL` unset to use the embedded database. See "Agent worktree
|
|
preflight", "Start Dev", "Quick Health Checks", and "Database in Dev" in
|
|
`doc/DEVELOPING.md`.
|
|
|
|
## 5. Core Engineering Rules
|
|
|
|
1. **Keep changes company-scoped.**
|
|
Every domain entity should be scoped to a company and company boundaries must be enforced in routes/services. The few instance-wide exceptions are listed in [`rules/company-scope-exceptions.mdc`](rules/company-scope-exceptions.mdc). Do not add another without adding it to that list.
|
|
|
|
2. **Keep contracts synchronized.**
|
|
If you change schema/API behavior, update all impacted layers:
|
|
- `packages/db` schema and exports
|
|
- `packages/shared` types/constants/validators
|
|
- `server` routes/services
|
|
- `ui` API clients and pages
|
|
|
|
3. **Preserve control-plane invariants.**
|
|
- Single-assignee task model
|
|
- Atomic issue checkout semantics
|
|
- Approval gates for governed actions
|
|
- Budget hard-stop auto-pause behavior
|
|
- Activity logging for mutating actions
|
|
|
|
4. **Keep behavior with its owning module.**
|
|
Provider protocols, payload parsing, and feature-specific sequencing belong to the module that owns them. Shared code uses narrow, normalized contracts. Explain any substantive change outside the owning module. See [`rules/module-boundaries.mdc`](rules/module-boundaries.mdc).
|
|
|
|
## 6. Database Changes
|
|
|
|
Follow "Schema change workflow" in `doc/DATABASE.md`: edit the schema, run
|
|
`pnpm db:generate`, then typecheck.
|
|
|
|
## 7. Verification Before Hand-off
|
|
|
|
Run the smallest check that proves the change. The default local and agent path is:
|
|
|
|
```sh
|
|
pnpm verify
|
|
```
|
|
|
|
This selects affected Vitest files with the same conservative dependency policy
|
|
as CI. It includes committed, staged, unstaged, and untracked changes against the
|
|
merge base with local `origin/master` (or `master`), and it reuses passing checks
|
|
whose inputs are unchanged. Use `--base <ref>` for another base, `--explain` to
|
|
inspect the selection, and `--no-cache` for fresh execution. See "Incremental
|
|
local verification" in `doc/DEVELOPING.md` for how reuse and invalidation work.
|
|
|
|
Follow these rules:
|
|
|
|
- **Exit 2 means the change needs broader verification.** Run focused checks and
|
|
let required CI supply that coverage, or explicitly use `pnpm verify --full`
|
|
for the full local Vitest suite. Do not automatically follow exit 2 with a full
|
|
local run.
|
|
- **Do not default to repo-wide checks.** Do not run repo-wide typecheck, build,
|
|
or test on every heartbeat when a narrower check is enough to prove the change.
|
|
Use the broad checks below only when they resolve an actual remaining gap, such
|
|
as a local platform fault or explicit full-suite qualification.
|
|
- **Browser suites stay opt-in.** Run `pnpm test:e2e` and
|
|
`pnpm test:release-smoke` only when your change touches them or when you are
|
|
explicitly verifying CI/release flows.
|
|
- **CI covers the final revision.** For a PR-ready handoff, run the relevant local
|
|
checks and require the applicable CI typecheck, build, and test checks to pass
|
|
for the final tested revision. Record their scope, revision, environment, and
|
|
result links. Fresh CI can supply broad coverage; do not duplicate a full local
|
|
run merely to prepare a PR, resume a chat, or repeat unchanged passing
|
|
verification. A selected local pass does not replace required CI, release
|
|
qualification, browser acceptance, or a local/platform-specific regression.
|
|
- **Evidence expires.** After edits or a rebase, rerun affected checks and
|
|
invalidate evidence whose inputs or required coverage changed. Failed or
|
|
interrupted attempts are never passes.
|
|
- **Report gaps.** If anything cannot be run, explicitly report what was not run
|
|
and why.
|
|
- **Attach deliverables.** When you work a Paperclip issue and produce a file for
|
|
the user to inspect, attach it as the `paperclip` skill and
|
|
`doc/AGENT-ARTIFACTS.md` describe. A local filesystem path is not enough.
|
|
|
|
Broad local checks:
|
|
|
|
```sh
|
|
pnpm -r typecheck
|
|
pnpm test:run
|
|
pnpm build
|
|
```
|
|
|
|
`pnpm test` and `pnpm test:run` run the full suite. If memory is limited, use
|
|
`node scripts/typecheck-low-memory.mjs` instead of `pnpm -r typecheck`. See
|
|
`doc/DEVELOPING.md`.
|
|
|
|
### Maps and Storybook
|
|
|
|
The [feature map](maps/feature-map/README.md) and the sibling
|
|
[agent access map](maps/agent-access-map/README.md) are optional references for
|
|
user entry points, agent entry points, permission boundaries, verification
|
|
recipes, and coverage gaps. They record coverage scope, not proof that a live
|
|
journey passed. Routine fixes, polish, refactors, and test changes do not require
|
|
map updates. When you do edit a map, follow
|
|
[the feature-map scope rule](rules/feature-map-scope.mdc) and
|
|
[the map contract](maps/README.md), then run `node scripts/check-maps.mjs`.
|
|
|
|
After story or recipe changes, update the affected source annotations or recipe
|
|
and run `node scripts/storybook-catalog.mjs`. Indexes are generated and ignored;
|
|
never commit them. See the [Storybook feature catalog](maps/storybook-map/README.md)
|
|
for the full workflow. Structural checks are not production acceptance.
|
|
|
|
## 8. API and Auth
|
|
|
|
Every route under `server/src/routes/` that reads or writes company data checks
|
|
company access and actor permissions, logs mutations to the activity log, and
|
|
returns consistent HTTP errors. See [`rules/api-route-expectations.mdc`](rules/api-route-expectations.mdc).
|
|
|
|
## 9. UI Expectations
|
|
|
|
- Keep routes and nav aligned with available API surface
|
|
- Use company selection context for company-scoped pages
|
|
- Surface failures clearly; do not silently ignore API errors
|
|
- Follow `DESIGN.md` for every UI design decision, including the token-only rule and form footers.
|
|
|
|
## 10. Fixing a Bug
|
|
|
|
When you are asked to fix a bug, attempt to use test-driven development and prove the fix red-green:
|
|
|
|
1. Reproduce the error yourself.
|
|
2. Write a test that fails because of the bug.
|
|
3. Write the fix.
|
|
4. Run the test and confirm that it passes.
|
|
5. Verify that the fix worked: repeat the reproduction from step 1 and confirm that the error is gone.
|
|
|
|
## 11. Pull Requests
|
|
|
|
Fill in every section of [`.github/PULL_REQUEST_TEMPLATE.md`](.github/PULL_REQUEST_TEMPLATE.md), however you create the pull request. Do not write an ad-hoc body. See "PR Requirements" in `CONTRIBUTING.md` for the details and thinking-path examples.
|
|
|
|
## 12. Definition of Done
|
|
|
|
A change is done when all are true:
|
|
|
|
1. Behavior matches what the task asked for and preserves the invariants in section 5
|
|
2. Relevant local verification and required CI typecheck, test, and build checks pass for the final revision, with any acceptance or platform-specific gaps resolved (section 7)
|
|
3. Contracts are synced across db/shared/server/ui
|
|
4. Docs updated when behavior or commands change
|
|
5. PR description follows the [PR template](.github/PULL_REQUEST_TEMPLATE.md) with all sections filled in (including Model Used)
|