Files
PaperClipAI/.greptile
Nicky LeachandClaude Opus 5.5 8362dbff4d feat(runner): make every ACPX provider declare its release attestation (#18342)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Native ACPX runs admit a provider only when its saved profile
version and `commandDigest` match the current profile exactly.
> - #18325 made every provider digest attest its upstream release, and
bound the shared ACPX layer and Runner source through the pack
`contractDigest`.
> - The model is documented, but it lived in prose. A new provider, such
as one in an open PR, could still choose another digest model without
any check or guidance.
> - This pull request makes the model the default path: each provider
declares its attestation in one registry, and the generator, a test and
a scoped rule explain the pattern where contributors meet it.
> - The benefit is that new providers and upstream bumps follow one
model, without a growing list of blocked legacy patterns.

## Linked Issues or Issue Description

Refs #18325, #18237.

**What happened?**

After #18325, only Copilot, Grok and Pi went through
`acpx-release-attestations.mjs`. Cursor and Antigravity had separate
inline checks in the generator, and Claude and Codex had none. A new
provider could add a profile with any digest. Nothing told the author
how to compute it, and nothing pinned the profile versions that now
change only for deliberate resets.

**Expected behavior**

Every ACPX provider declares how its `commandDigest` attests the
upstream release. Tools and review guidance describe the pattern when a
contributor adds a provider, bumps an upstream release or changes a
version.

**Steps to reproduce**

1. Add a new provider profile to
`packages/paperclip-runner/acpx-profiles.json` with an arbitrary
`commandDigest`.
2. Run `node
packages/paperclip-runner/scripts/generate-acpx-profiles.mjs --check`.
3. Before this change, the check passes.

## What Changed

- Add `ACPX_RELEASE_ATTESTATIONS` to
`scripts/acpx-release-attestations.mjs`. Every profile declares one
kind:
- `installed-command` (Claude, Codex): installation hashes the upstream
launch command.
  - `launcher` (Grok): the SHA-256 of the launcher shipped verbatim.
- `closure` (Copilot, Pi): upstream versions and complete platform
closure pins.
- `declaration` (Cursor, Antigravity): a checked-in release declaration,
as canonical JSON.
- `generate-acpx-profiles.mjs` checks every profile through the
registry. The separate Cursor and Antigravity digest checks are now part
of the same path. No digest changes.
- A profile without a declared attestation fails generation. The message
says to declare one and points to the rule.
- A stale digest message now says that a digest changes only with its
upstream release, and that an upstream change keeps the profile version.
- Add a test that pins the profile versions. It explains that a bump
resets every saved session for that provider, and that a new provider
starts at 1.
- Add `rules/acpx-profile-identity.mdc`. It describes the identity
model, how to add a provider, when to bump a version, and review
criteria. `AGENTS.md` and `.greptile/files.json` route the profile,
attestation, contract-registry, ACPX driver and provider paths to it.
- Update the profile identity section in
`packages/paperclip-runner/docs/durable-recovery.md` with the
attestation kinds and the version policy.

## Verification

- In `packages/paperclip-runner`:
- `node scripts/generate-acpx-profiles.mjs --check` passes. Running it
without `--check` changes no digest.
- `node --test scripts/acpx-release-attestations.test.mjs
scripts/contracts/contract-fingerprints.test.mjs`: 22 tests pass. New
cases: every profile declares an attestation, a new provider without one
fails with guidance, and Cursor and Antigravity declaration changes
affect only their own digests.
- `vitest run src/drivers/acpx/profile-compatibility.test.ts`: 15 tests
pass, including the version table.
  - `tsc -p tsconfig.json --noEmit` passes.

## Risks

- Low risk. No digest, version or runtime admission behavior changes.
- A new provider PR must add one registry entry. The generator error
states what to add.
- The version table needs an edit for each deliberate reset. Upstream
bumps do not touch it.

## Model Used

- Claude Opus 5.5 (`claude-opus-5-5`) in Claude Code, with tool use
(shell, file edits, local test runs).

## 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
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [x] 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-10-30 11:25:06 -07:00
..

Greptile configuration

This directory tracks the supported review configuration for paperclipai/paperclip. It was prepared from a read-only dashboard inventory on 2026-10-13. No dashboard settings or custom context were changed.

  • config.json records the observed review settings supported by Greptile's documented file schema.
  • files.json loads repository context and scopes architectural rule files.
  • rules.md explains how to apply the canonical Markdown rules in rules/.

Settings migrated to Git

Dashboard setting Repository configuration
Automatic reviews on all events autoReview: ["open", "push", "rebase"]
Exclude dependabot[bot]; remaining reviews use Base excludeAuthors, effort: "base"
High strictness (dashboard says it does not comment on P2s) strictness: 3
Do not replace the PR description shouldUpdateDescription: false
Include PR summary, confidence score, and findings; no sequence diagram The four section settings in config.json
Summary is not collapsible; default-open option is off summarySection.collapsible and defaultOpen are false
Include a prompt to fix findings fixWithAI: true
Status checks and status comments enabled statusCheck and statusCommentsEnabled are true
Auto-approval disabled; stored risk ceiling is Low autoApprove.enabled: false, riskCeiling: "low"

The existing PR-description and 1,000-line growth guidance is in rules/pull-request-review.mdc. That file also preserves the active, repository-specific rule not to request UI screenshots. This resolves the contradiction with the older organization instruction asking for screenshots.

The active dashboard pattern **/[Aa][Gg][Ee][Nn][Tt][Ss].md reported two files: AGENTS.md and docs/api/agents.md. Both are explicit references in files.json; the latter remains API context, not contributor policy. Future context files need explicit manifest entries. The inactive Contribution guidelines context remains inactive; it is not added as a separate context file. Rules scoped to other repositories are not copied here.

Settings still managed in Greptile

The following observed controls do not have equivalents in the published .greptile/ schema used for this migration. They remain dashboard settings:

  • Review draft pull requests: enabled.
  • Required confidence to pass the status check: 5/5.
  • Image badges: enabled.
  • Comment header: empty.
  • Default coding-agent badges: no agents shown.

Repository enablement, provider authentication, billing, integrations, and learned memory also remain service settings. Auto-approval risk instructions, if used later, are explicitly dashboard-only in Greptile's reference. Do not invent config keys for unsupported controls.

Cutover and maintenance

Greptile reads committed configuration from the reviewed branch. No reindex is required. Local changes alone are not visible to the hosted reviewer.

File-based review settings override dashboard defaults, but dashboard rules and instructions are additive. The existing dashboard copies are still active. This is a staged migration, not a completed dashboard cleanup. After a hosted review verifies the configuration, an authorized maintainer can retire duplicate dashboard context scoped to this repository. Do not remove shared organization instructions while other repositories still depend on them.

Keep each policy's body in rules/; update the files.json scope together with the rule's MDC frontmatter. The chat-channel rule includes both the directory and its sibling service entry point. See rules/README.md for authoring steps.

References: configuration and precedence, supported fields and file references.