f98c348e2b
## Thinking Path > - Paperclip orchestrates AI agents for zero-human companies. > - This branch extends the issue control-plane so board operators can pause, cancel, and later restore whole issue subtrees while keeping descendant execution and wake behavior coherent. > - That required new hold state in the database, shared contracts, server routes/services, and issue detail UI controls so subtree actions are durable and auditable instead of ad hoc. > - While this branch was in flight, `master` advanced with new environment lifecycle work, including a new `0065_environments` migration. > - Before opening the PR, this branch had to be rebased onto `paperclipai/paperclip:master` without losing the existing subtree-control work or leaving conflicting migration numbering behind. > - This pull request rebases the subtree pause/cancel/restore feature cleanly onto current `master`, renumbers the hold migration to `0066_issue_tree_holds`, and preserves the full branch diff in a single PR. > - The benefit is that reviewers get one clean, mergeable PR for the subtree-control feature instead of stale branch history with migration conflicts. ## What Changed - Added durable issue subtree hold data structures, shared API/types/validators, server routes/services, and UI flows for subtree pause, cancel, and restore operations. - Added server and UI coverage for subtree previewing, hold creation/release, dependency-aware scheduling under holds, and issue detail subtree controls. - Rebased the branch onto current `paperclipai/paperclip:master` and renumbered the branch migration from `0065_issue_tree_holds` to `0066_issue_tree_holds` so it no longer conflicts with upstream `0065_environments`. - Added a small follow-up commit that makes restore requests return `200 OK` explicitly while keeping pause/cancel hold creation at `201 Created`, and updated the route test to match that contract. ## Verification - `pnpm --filter @paperclipai/db typecheck` - `pnpm --filter @paperclipai/shared typecheck` - `pnpm --filter @paperclipai/server typecheck` - `pnpm --filter @paperclipai/ui typecheck` - `cd server && pnpm exec vitest run src/__tests__/issue-tree-control-routes.test.ts src/__tests__/issue-tree-control-service.test.ts src/__tests__/issue-tree-control-service-unit.test.ts src/__tests__/heartbeat-dependency-scheduling.test.ts` - `cd ui && pnpm exec vitest run src/components/IssueChatThread.test.tsx src/pages/IssueDetail.test.tsx` ## Risks - This is a broad cross-layer change touching DB/schema, shared contracts, server orchestration, and UI; regressions are most likely around subtree status restoration or wake suppression/resume edge cases. - The migration was renumbered during PR prep to avoid the new upstream `0065_environments` conflict. Reviewers should confirm the final `0066_issue_tree_holds` ordering is the only hold-related migration that lands. - The issue-tree restore endpoint now responds with `200` instead of relying on implicit behavior, which is semantically better for a restore operation but still changes an API detail that clients or tests could have assumed. > 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 coding agent in the Paperclip Codex runtime (GPT-5-class tool-using coding model; exact deployment ID/context window is not exposed inside this session). ## 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 - [ ] If this change affects the UI, I have included before/after screenshots - [ ] 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>
476 lines
9.6 KiB
JSON
476 lines
9.6 KiB
JSON
{
|
|
"version": "7",
|
|
"dialect": "postgresql",
|
|
"entries": [
|
|
{
|
|
"idx": 0,
|
|
"version": "7",
|
|
"when": 1771300567463,
|
|
"tag": "0000_mature_masked_marvel",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 1,
|
|
"version": "7",
|
|
"when": 1771349039633,
|
|
"tag": "0001_fast_northstar",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 2,
|
|
"version": "7",
|
|
"when": 1771349403162,
|
|
"tag": "0002_big_zaladane",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 3,
|
|
"version": "7",
|
|
"when": 1771456737635,
|
|
"tag": "0003_shallow_quentin_quire",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 4,
|
|
"version": "7",
|
|
"when": 1771545600000,
|
|
"tag": "0004_issue_identifiers",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 5,
|
|
"version": "7",
|
|
"when": 1771545601000,
|
|
"tag": "0005_chief_luke_cage",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 6,
|
|
"version": "7",
|
|
"when": 1771545602000,
|
|
"tag": "0006_overjoyed_mister_sinister",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 7,
|
|
"version": "7",
|
|
"when": 1771545603000,
|
|
"tag": "0007_new_quentin_quire",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 8,
|
|
"version": "7",
|
|
"when": 1771534160426,
|
|
"tag": "0008_amused_zzzax",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 9,
|
|
"version": "7",
|
|
"when": 1771534211029,
|
|
"tag": "0009_fast_jackal",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 10,
|
|
"version": "7",
|
|
"when": 1771605173513,
|
|
"tag": "0010_stale_justin_hammer",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 11,
|
|
"version": "7",
|
|
"when": 1771616419708,
|
|
"tag": "0011_windy_corsair",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 12,
|
|
"version": "7",
|
|
"when": 1771619674673,
|
|
"tag": "0012_perpetual_ser_duncan",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 13,
|
|
"version": "7",
|
|
"when": 1771623691139,
|
|
"tag": "0013_dashing_wasp",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 14,
|
|
"version": "7",
|
|
"when": 1771691806349,
|
|
"tag": "0014_many_mikhail_rasputin",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 15,
|
|
"version": "7",
|
|
"when": 1771865100000,
|
|
"tag": "0015_project_color_archived",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 16,
|
|
"version": "7",
|
|
"when": 1771955900000,
|
|
"tag": "0016_agent_icon",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 17,
|
|
"version": "7",
|
|
"when": 1771883888199,
|
|
"tag": "0017_tiresome_gabe_jones",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 18,
|
|
"version": "7",
|
|
"when": 1771897769629,
|
|
"tag": "0018_flat_sleepwalker",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 19,
|
|
"version": "7",
|
|
"when": 1772029333401,
|
|
"tag": "0019_public_victor_mancha",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 20,
|
|
"version": "7",
|
|
"when": 1772032176413,
|
|
"tag": "0020_white_anita_blake",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 21,
|
|
"version": "7",
|
|
"when": 1772122471656,
|
|
"tag": "0021_chief_vindicator",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 22,
|
|
"version": "7",
|
|
"when": 1772186400000,
|
|
"tag": "0022_company_brand_color",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 23,
|
|
"version": "7",
|
|
"when": 1772139727599,
|
|
"tag": "0023_fair_lethal_legion",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 24,
|
|
"version": "7",
|
|
"when": 1772806603601,
|
|
"tag": "0024_far_beast",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 25,
|
|
"version": "7",
|
|
"when": 1772807461603,
|
|
"tag": "0025_nasty_salo",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 26,
|
|
"version": "7",
|
|
"when": 1773089625430,
|
|
"tag": "0026_lying_pete_wisdom",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 27,
|
|
"version": "7",
|
|
"when": 1773150731736,
|
|
"tag": "0027_tranquil_tenebrous",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 28,
|
|
"version": "7",
|
|
"when": 1773432085646,
|
|
"tag": "0028_harsh_goliath",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 29,
|
|
"version": "7",
|
|
"when": 1773417600000,
|
|
"tag": "0029_plugin_tables",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 30,
|
|
"version": "7",
|
|
"when": 1773670925214,
|
|
"tag": "0030_rich_magneto",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 31,
|
|
"version": "7",
|
|
"when": 1773511922713,
|
|
"tag": "0031_zippy_magma",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 32,
|
|
"version": "7",
|
|
"when": 1773542934499,
|
|
"tag": "0032_pretty_doctor_octopus",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 33,
|
|
"version": "7",
|
|
"when": 1773664961967,
|
|
"tag": "0033_shiny_black_tarantula",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 34,
|
|
"version": "7",
|
|
"when": 1773697572188,
|
|
"tag": "0034_fat_dormammu",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 35,
|
|
"version": "7",
|
|
"when": 1773698696169,
|
|
"tag": "0035_marvelous_satana",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 36,
|
|
"version": "7",
|
|
"when": 1773756213455,
|
|
"tag": "0036_cheerful_nitro",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 37,
|
|
"version": "7",
|
|
"when": 1773756922363,
|
|
"tag": "0037_friendly_eddie_brock",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 38,
|
|
"version": "7",
|
|
"when": 1773931592563,
|
|
"tag": "0038_careless_iron_monger",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 39,
|
|
"version": "7",
|
|
"when": 1773926116580,
|
|
"tag": "0039_fat_magneto",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 40,
|
|
"version": "7",
|
|
"when": 1773927102783,
|
|
"tag": "0040_eager_shotgun",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 41,
|
|
"version": "7",
|
|
"when": 1774011294562,
|
|
"tag": "0041_curly_maria_hill",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 42,
|
|
"version": "7",
|
|
"when": 1774031825634,
|
|
"tag": "0042_spotty_the_renegades",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 43,
|
|
"version": "7",
|
|
"when": 1774008910991,
|
|
"tag": "0043_reflective_captain_universe",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 44,
|
|
"version": "7",
|
|
"when": 1774269579794,
|
|
"tag": "0044_illegal_toad",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 45,
|
|
"version": "7",
|
|
"when": 1774530504348,
|
|
"tag": "0045_workable_shockwave",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 46,
|
|
"version": "7",
|
|
"when": 1774960197878,
|
|
"tag": "0046_smooth_sentinels",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 47,
|
|
"version": "7",
|
|
"when": 1775137972687,
|
|
"tag": "0047_overjoyed_groot",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 48,
|
|
"version": "7",
|
|
"when": 1775145655557,
|
|
"tag": "0048_flashy_marrow",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 49,
|
|
"version": "7",
|
|
"when": 1775349863293,
|
|
"tag": "0049_flawless_abomination",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 50,
|
|
"version": "7",
|
|
"when": 1775487782768,
|
|
"tag": "0050_stiff_luckman",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 51,
|
|
"version": "7",
|
|
"when": 1775524651831,
|
|
"tag": "0051_young_korg",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 52,
|
|
"version": "7",
|
|
"when": 1775571715162,
|
|
"tag": "0052_mushy_trauma",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 53,
|
|
"version": "7",
|
|
"when": 1775604018515,
|
|
"tag": "0053_sharp_wild_child",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 54,
|
|
"version": "7",
|
|
"when": 1775750400000,
|
|
"tag": "0054_draft_routines",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 55,
|
|
"version": "7",
|
|
"when": 1775825256196,
|
|
"tag": "0055_kind_weapon_omega",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 56,
|
|
"version": "7",
|
|
"when": 1776084034244,
|
|
"tag": "0056_spooky_ultragirl",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 57,
|
|
"version": "7",
|
|
"when": 1776309613598,
|
|
"tag": "0057_tidy_join_requests",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 58,
|
|
"version": "7",
|
|
"when": 1776542245004,
|
|
"tag": "0058_wealthy_starbolt",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 59,
|
|
"version": "7",
|
|
"when": 1776542246000,
|
|
"tag": "0059_plugin_database_namespaces",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 60,
|
|
"version": "7",
|
|
"when": 1776717606743,
|
|
"tag": "0060_orange_annihilus",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 61,
|
|
"version": "7",
|
|
"when": 1776785165389,
|
|
"tag": "0061_lively_thor_girl",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 62,
|
|
"version": "7",
|
|
"when": 1776780000000,
|
|
"tag": "0062_routine_run_dispatch_fingerprint",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 63,
|
|
"version": "7",
|
|
"when": 1776780001000,
|
|
"tag": "0063_issue_thread_interactions",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 64,
|
|
"version": "7",
|
|
"when": 1776780002000,
|
|
"tag": "0064_issue_thread_interaction_idempotency",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 65,
|
|
"version": "7",
|
|
"when": 1776903900000,
|
|
"tag": "0065_environments",
|
|
"breakpoints": true
|
|
},
|
|
{
|
|
"idx": 66,
|
|
"version": "7",
|
|
"when": 1776903901000,
|
|
"tag": "0066_issue_tree_holds",
|
|
"breakpoints": true
|
|
}
|
|
]
|
|
}
|