Files
PaperClipAI/AGENTS.md
T
DottaandClaude Opus 5.5 9b21dcbdda refactor: remove SPEC docs and repoint spec citations (#20565)
## 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>
2026-11-10 13:07:59 -06:00

9.9 KiB

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:

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 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

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. 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.

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:

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:

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 and the sibling agent access map 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 and the map contract, 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 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.

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, 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 with all sections filled in (including Model Used)