mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-18 11:40:39 +09:00
## Thinking Path > - Paperclip orchestrates AI agents for zero-human companies > - The control plane must recover stranded agent work without creating new operational loops > - Stranded recovery issues can themselves fail, and exposing raw retry errors in comments can leak sensitive adapter details > - New local companies also should not force a hire-approval gate unless operators enable that policy > - This pull request hardens recovery issue handling, redacts retry failure details in issue copy, preserves `maxConcurrentRuns: 1`, and flips new-hire approval to an opt-in default > - The benefit is safer automatic recovery and smoother default company setup without hidden migration conflicts ## What Changed - Added migration `0071_default_hire_approval_off` and updated company schema/import/export/docs so hire approvals default off and serialize only when enabled. - Added migration `0072_large_sandman` with a partial unique index preventing duplicate active stranded recovery issues for the same source issue. - Blocked failed `stranded_issue_recovery` issues in place instead of creating nested recovery issues. - Redacted latest retry failure details from recovery issue comments while still linking reviewers to run evidence. - Allowed `maxConcurrentRuns: 1` to be honored by heartbeat concurrency normalization. - Added focused regression coverage for recovery recursion, redaction, migration ordering, and concurrency behavior. ## Verification - `pnpm --filter @paperclipai/db run check:migrations` - `pnpm exec vitest run --project @paperclipai/server server/src/__tests__/recovery-classifiers.test.ts` - `pnpm exec vitest run --project @paperclipai/server server/src/__tests__/company-portability.test.ts --pool=forks --poolOptions.forks.isolate=true` - `pnpm exec vitest run --project @paperclipai/server server/src/__tests__/agent-permissions-routes.test.ts --pool=forks --poolOptions.forks.isolate=true` - `pnpm --filter @paperclipai/server typecheck` - `pnpm exec vitest run --project @paperclipai/server server/src/__tests__/heartbeat-process-recovery.test.ts --pool=forks --poolOptions.forks.isolate=true` exits 0, but this host skipped the embedded Postgres tests with the existing init guard. - `pnpm exec vitest run --project @paperclipai/server server/src/__tests__/heartbeat-dependency-scheduling.test.ts --pool=forks --poolOptions.forks.isolate=true` exits 0, but this host skipped the embedded Postgres tests with the existing init guard. ## Risks - Migration risk is low but this PR intentionally owns both new migrations to avoid separate PR migration-journal conflicts. - Recovery comments now require operators to inspect linked run evidence for details instead of reading raw errors inline. - The hire approval default changes behavior for newly created/imported companies only; existing persisted company settings are not changed except by the SQL default for future rows. > 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 - OpenAI Codex, GPT-5 coding agent, tool-enabled terminal/GitHub workflow, reasoning mode active. Context window not exposed in this environment. ## 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 run tests locally and they pass - [x] I have added or updated tests where applicable - [x] If this change affects the UI, I have included before/after screenshots - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <noreply@paperclip.ing> |
||
|---|---|---|
| .. | ||
| 0000_snapshot.json | ||
| 0001_snapshot.json | ||
| 0002_snapshot.json | ||
| 0003_snapshot.json | ||
| 0005_snapshot.json | ||
| 0006_snapshot.json | ||
| 0007_snapshot.json | ||
| 0008_snapshot.json | ||
| 0009_snapshot.json | ||
| 0010_snapshot.json | ||
| 0011_snapshot.json | ||
| 0012_snapshot.json | ||
| 0013_snapshot.json | ||
| 0014_snapshot.json | ||
| 0017_snapshot.json | ||
| 0018_snapshot.json | ||
| 0019_snapshot.json | ||
| 0020_snapshot.json | ||
| 0021_snapshot.json | ||
| 0023_snapshot.json | ||
| 0024_snapshot.json | ||
| 0025_snapshot.json | ||
| 0027_snapshot.json | ||
| 0028_snapshot.json | ||
| 0029_snapshot.json | ||
| 0030_snapshot.json | ||
| 0031_snapshot.json | ||
| 0032_snapshot.json | ||
| 0033_snapshot.json | ||
| 0034_snapshot.json | ||
| 0035_snapshot.json | ||
| 0036_snapshot.json | ||
| 0037_snapshot.json | ||
| 0038_snapshot.json | ||
| 0039_snapshot.json | ||
| 0040_snapshot.json | ||
| 0041_snapshot.json | ||
| 0044_snapshot.json | ||
| 0045_snapshot.json | ||
| 0046_snapshot.json | ||
| 0047_snapshot.json | ||
| 0048_snapshot.json | ||
| 0049_snapshot.json | ||
| 0050_snapshot.json | ||
| 0051_snapshot.json | ||
| 0052_snapshot.json | ||
| 0053_snapshot.json | ||
| 0055_snapshot.json | ||
| 0056_snapshot.json | ||
| 0057_snapshot.json | ||
| 0058_snapshot.json | ||
| 0060_snapshot.json | ||
| 0061_snapshot.json | ||
| 0072_snapshot.json | ||
| _journal.json | ||