copper-pilot-cli 0.1.11__tar.gz → 1.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. copper_pilot_cli-1.0.2/HISTORY.md +1470 -0
  2. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/PKG-INFO +31 -2
  3. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/README.md +28 -1
  4. copper_pilot_cli-1.0.2/VERSION +1 -0
  5. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/docs/cli.md +215 -35
  6. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/docs/harness.md +2 -1
  7. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/docs/validate.md +8 -3
  8. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/pyproject.toml +6 -0
  9. copper_pilot_cli-1.0.2/src/copper_pilot_cli/chat_context.py +1262 -0
  10. copper_pilot_cli-1.0.2/src/copper_pilot_cli/checkpoint_events.py +90 -0
  11. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_acp.py +455 -28
  12. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_app.py +605 -29
  13. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_background.py +34 -1
  14. copper_pilot_cli-1.0.2/src/copper_pilot_cli/copper_btw.py +321 -0
  15. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_chrome.py +29 -5
  16. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_config.py +42 -0
  17. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_features.py +24 -1
  18. copper_pilot_cli-1.0.2/src/copper_pilot_cli/copper_graph.py +1770 -0
  19. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_main.py +316 -22
  20. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_mcp.py +3 -2
  21. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_models.py +152 -15
  22. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_preferences.py +2 -5
  23. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_presentation.py +11 -3
  24. copper_pilot_cli-1.0.2/src/copper_pilot_cli/copper_protocol.py +1251 -0
  25. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_tools.py +4 -0
  26. copper_pilot_cli-1.0.2/src/copper_pilot_cli/copper_update.py +236 -0
  27. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_widgets.py +213 -2
  28. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_workspace.py +27 -15
  29. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/deepagents_tools.py +192 -15
  30. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/diagnostics.py +17 -1
  31. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/langchain.py +61 -6
  32. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/sessions.py +354 -3
  33. copper_pilot_cli-1.0.2/src/copper_pilot_cli/shell_scope.py +662 -0
  34. copper_pilot_cli-1.0.2/src/copper_pilot_cli/turn_journal.py +410 -0
  35. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/builtins.py +259 -0
  36. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/cli.py +4 -0
  37. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/config.py +3 -0
  38. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/default.yaml +18 -1
  39. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/design.py +16 -0
  40. copper_pilot_cli-1.0.2/src/copper_pilot_cli/validate/pcb.py +717 -0
  41. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/report.py +15 -0
  42. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/reviewer.py +9 -4
  43. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/runner.py +5 -6
  44. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/conftest.py +15 -0
  45. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/slash-menu.txt +2 -2
  46. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_acp.py +540 -16
  47. copper_pilot_cli-1.0.2/tests/test_btw.py +280 -0
  48. copper_pilot_cli-1.0.2/tests/test_chat_context.py +1310 -0
  49. copper_pilot_cli-1.0.2/tests/test_checkpoint_growth.py +462 -0
  50. copper_pilot_cli-1.0.2/tests/test_diagnostics.py +39 -0
  51. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_durability.py +344 -15
  52. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_features.py +26 -0
  53. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_langchain.py +1 -1
  54. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_mcp.py +2 -0
  55. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_models.py +32 -11
  56. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_protocol.py +103 -0
  57. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_protocol_batch.py +71 -7
  58. copper_pilot_cli-1.0.2/tests/test_resume_protocol.py +1091 -0
  59. copper_pilot_cli-1.0.2/tests/test_shell_scope.py +290 -0
  60. copper_pilot_cli-1.0.2/tests/test_tools.py +655 -0
  61. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_tui.py +698 -6
  62. copper_pilot_cli-1.0.2/tests/test_turn_journal.py +33 -0
  63. copper_pilot_cli-1.0.2/tests/test_update.py +309 -0
  64. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_validate.py +402 -0
  65. copper_pilot_cli-1.0.2/tests/test_workspace.py +118 -0
  66. copper_pilot_cli-0.1.11/HISTORY.md +0 -633
  67. copper_pilot_cli-0.1.11/VERSION +0 -1
  68. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_graph.py +0 -547
  69. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_protocol.py +0 -769
  70. copper_pilot_cli-0.1.11/src/copper_pilot_cli/copper_update.py +0 -32
  71. copper_pilot_cli-0.1.11/tests/test_tools.py +0 -254
  72. copper_pilot_cli-0.1.11/tests/test_workspace.py +0 -32
  73. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/.claude-plugin/marketplace.json +0 -0
  74. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/.gitignore +0 -0
  75. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/CODE_OF_CONDUCT.md +0 -0
  76. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/CONTRIBUTING.md +0 -0
  77. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/LICENSE +0 -0
  78. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/NOTICE +0 -0
  79. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/SECURITY.md +0 -0
  80. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/SUPPORT.md +0 -0
  81. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/UPSTREAM.md +0 -0
  82. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/docs/assets/esp32-mini-1-h4.gif +0 -0
  83. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/docs/assets/logo-dark.png +0 -0
  84. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/docs/assets/logo-light.png +0 -0
  85. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/docs/assets/logo.png +0 -0
  86. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/docs/development.md +0 -0
  87. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/.gitignore +0 -0
  88. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/.copperpilot/PLANS.md +0 -0
  89. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/.copperpilot/README.md +0 -0
  90. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/.copperpilot/TOOLS.md +0 -0
  91. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/.copperpilot/plans/esp32-dev-board.plan.md +0 -0
  92. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/.gitignore +0 -0
  93. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/README.md +0 -0
  94. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/esp32/3d-models/SW-SMD_L3.9-W2.9-H2.0-LS4.8.step +0 -0
  95. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/esp32/3d-models/TYPE-C-31-M-12.step +0 -0
  96. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/esp32/esp32.kicad_pcb +0 -0
  97. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/esp32/esp32.kicad_pro +0 -0
  98. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/esp32/esp32.kicad_sch +0 -0
  99. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/esp32/esp32.png +0 -0
  100. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/helper.py +0 -0
  101. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/001_esp32/main.py +0 -0
  102. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/.copperpilot/PLANS.md +0 -0
  103. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/.copperpilot/README.md +0 -0
  104. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/.copperpilot/plans/cm5-camera-carrier.plan.md +0 -0
  105. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/.gitignore +0 -0
  106. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/README.md +0 -0
  107. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/assembly_spec.json +0 -0
  108. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/3dmodels/CM4.step +0 -0
  109. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/3dmodels/CM5.step +0 -0
  110. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/3dmodels/Camera_IMX219-D160.step +0 -0
  111. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_Molex_105057-0001_Vertical.wrl +0 -0
  112. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/3dmodels/USB_A_vertical.step +0 -0
  113. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/5033981892.stp +0 -0
  114. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/DF40C-100DS.stp +0 -0
  115. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/JTHDA-19F08.STEP +0 -0
  116. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/CM5.3dshapes/SRP5030CC.stp +0 -0
  117. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_dru +0 -0
  118. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pcb +0 -0
  119. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_pro +0 -0
  120. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sch +0 -0
  121. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.kicad_sym +0 -0
  122. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.png +0 -0
  123. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0402_1005Metric.kicad_mod +0 -0
  124. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/C_0805_2012Metric.kicad_mod +0 -0
  125. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Camera_Module_IMX219-D160.kicad_mod +0 -0
  126. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Crystal_SMD_3225-4Pin_3.2x2.5mm.kicad_mod +0 -0
  127. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/HDMI_Mini-C_Molex_47151-0001.kicad_mod +0 -0
  128. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/LED_0603_1608Metric.kicad_mod +0 -0
  129. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_Bourns_SRP5030CC.kicad_mod +0 -0
  130. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/L_CommonModeChoke_Coilank_ACM1210.kicad_mod +0 -0
  131. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/MOLEX_USB_67298-4090.kicad_mod +0 -0
  132. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Molex_200528-0150_1x15-1MP_P1.00mm_Horizontal.kicad_mod +0 -0
  133. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_1x03_P2.54mm_Vertical.kicad_mod +0 -0
  134. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/PinHeader_2x20_P2.54mm_Vertical.kicad_mod +0 -0
  135. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0402_1005Metric.kicad_mod +0 -0
  136. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/R_0603_1608Metric.kicad_mod +0 -0
  137. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Raspberry-Pi-4-Compute-Module.kicad_mod +0 -0
  138. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SDCARD_MOLEX_503398-1892.kicad_mod +0 -0
  139. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SOT-23-5.kicad_mod +0 -0
  140. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/SW_SPST_PTS645Sx43SMTR92.kicad_mod +0 -0
  141. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/TSOT-23-6.kicad_mod +0 -0
  142. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/Texas_DRT-3.kicad_mod +0 -0
  143. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/UQFN-10_1.4x1.8mm_P0.4mm.kicad_mod +0 -0
  144. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera.pretty/USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal.kicad_mod +0 -0
  145. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/cm5_camera_bottom.png +0 -0
  146. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/fp-lib-table +0 -0
  147. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/cm5_camera/sym-lib-table +0 -0
  148. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/generate_3d_models.py +0 -0
  149. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/helper.py +0 -0
  150. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/examples/002_cm5_camera/main.py +0 -0
  151. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/plugins/copper-pilot/.claude-plugin/plugin.json +0 -0
  152. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/plugins/copper-pilot/.mcp.json +0 -0
  153. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/plugins/copper-pilot/agents/copper-pilot.md +0 -0
  154. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/plugins/copper-pilot/skills/copper-pilot-review/SKILL.md +0 -0
  155. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/skills/copper-pilot-review/SKILL.md +0 -0
  156. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/__init__.py +0 -0
  157. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/__main__.py +0 -0
  158. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/_upstream/__init__.py +0 -0
  159. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/_upstream/dcode_0_1_69/PROVENANCE.json +0 -0
  160. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/_upstream/dcode_0_1_69/__init__.py +0 -0
  161. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/_upstream/dcode_0_1_69/diff_utils.py +0 -0
  162. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/_version.py +0 -0
  163. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/clipboard.py +0 -0
  164. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_api.py +0 -0
  165. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_auth.py +0 -0
  166. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_hooks.py +0 -0
  167. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_logo.py +0 -0
  168. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_status_events.py +0 -0
  169. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/copper_theme.py +0 -0
  170. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/media_utils.py +0 -0
  171. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/py.typed +0 -0
  172. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/textual_patches.py +0 -0
  173. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/tool_batch.py +0 -0
  174. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/__init__.py +0 -0
  175. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/src/copper_pilot_cli/validate/kicad.py +0 -0
  176. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/approval.txt +0 -0
  177. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/idle-input-120-ascii.txt +0 -0
  178. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/idle-input-120-color.txt +0 -0
  179. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/idle-input-120-nocolor.txt +0 -0
  180. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/idle-input-50-ascii.txt +0 -0
  181. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/idle-input-50-color.txt +0 -0
  182. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/idle-input-50-nocolor.txt +0 -0
  183. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/idle-input-80-ascii.txt +0 -0
  184. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/idle-input-80-color.txt +0 -0
  185. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/idle-input-80-nocolor.txt +0 -0
  186. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/status-agent-balanced.txt +0 -0
  187. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/status-agent-intelligence.txt +0 -0
  188. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/status-ask-balanced.txt +0 -0
  189. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/status-ask-intelligence.txt +0 -0
  190. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/status-plan-balanced.txt +0 -0
  191. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/status-plan-intelligence.txt +0 -0
  192. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/welcome-120-ascii.txt +0 -0
  193. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/welcome-120-color.txt +0 -0
  194. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/welcome-120-nocolor.txt +0 -0
  195. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/welcome-50-ascii.txt +0 -0
  196. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/welcome-50-color.txt +0 -0
  197. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/welcome-50-nocolor.txt +0 -0
  198. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/welcome-80-ascii.txt +0 -0
  199. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/welcome-80-color.txt +0 -0
  200. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/welcome-80-nocolor.txt +0 -0
  201. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/snapshots/working-color.txt +0 -0
  202. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_auth.py +0 -0
  203. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_chrome_snapshots.py +0 -0
  204. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_clipboard.py +0 -0
  205. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_cm5_camera_example.py +0 -0
  206. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_copper_api.py +0 -0
  207. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_e2e.py +0 -0
  208. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_esp32_example.py +0 -0
  209. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_graph_batch.py +0 -0
  210. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_live_chat_e2e.py +0 -0
  211. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_logo.py +0 -0
  212. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_main.py +0 -0
  213. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_plugin_manifest.py +0 -0
  214. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_preferences.py +0 -0
  215. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_presentation.py +0 -0
  216. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_release_gates.py +0 -0
  217. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_sessions.py +0 -0
  218. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_status_events.py +0 -0
  219. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_themes_and_speed.py +0 -0
  220. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_tool_batch.py +0 -0
  221. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_upstream_provenance.py +0 -0
  222. {copper_pilot_cli-0.1.11 → copper_pilot_cli-1.0.2}/tests/test_validate_live.py +0 -0
@@ -0,0 +1,1470 @@
1
+ Changelog
2
+ =========
3
+
4
+
5
+ (unreleased)
6
+ ------------
7
+
8
+ Fix
9
+ ~~~
10
+ - Keep the truncation marker inside the context message limit.
11
+ [AdityaNG]
12
+
13
+ _truncate_utf8 clipped a chat-history message to MAX_CONTEXT_MESSAGE_BYTES
14
+ and then appended "\n[truncated]", so every clipped message was 12 bytes
15
+ over the server's 64 KiB per-message limit. The server answered 413
16
+ chat_request_too_large and, because each later turn (and the fresh-
17
+ conversation fallback) resends the same history, the chat could never
18
+ continue.
19
+
20
+ Found in the 12 Nov design bench: an L1 Balanced build turn streamed more
21
+ than 64 KiB of ERC/DRC report text into its reply, and the next turn died
22
+ with "This conversation is too large to continue". The marker now fits
23
+ inside the limit, including when a multi-byte character straddles the cut.
24
+ - Read server-internal files raw (purpose server_internal_text)
25
+ [AdityaNG]
26
+
27
+ The server's own reads of netlists and DRC/ERC reports went through the
28
+ Deep Agents read_file. Over its ~80k character budget that read put
29
+ '[Output was truncated due to size limits...]' above the '@@ lines' page
30
+ header; the server took the page for the whole file and parsed a cut
31
+ netlist (sync_schematic_to_pcb ExpectClosingBracket, query_design XML
32
+ ParseError, run_drc JSON errors in the Nov 6 design bench).
33
+
34
+ Servers now tag those reads server_internal_text; read them raw like the
35
+ workspace KiCad purposes, whole or header-first pages.
36
+
37
+ Other
38
+ ~~~~~
39
+ - Merge pull request #56 from
40
+ CopperPilot/feat/auto_intelligence_model_13_nov_2026. [Aditya]
41
+
42
+ Send model auto on Intelligence turns so the server picks the model
43
+ - Test: context-usage fixture names the Balanced model (Gemini 4 Carbon)
44
+ [AdityaNG]
45
+ - Send model "auto" on Intelligence turns so the server picks the model.
46
+ [AdityaNG]
47
+
48
+ While the model selector is off every Intelligence turn now asks for "auto"
49
+ instead of pinning gemini-4-argon, so a server-side default change (Gemini 4
50
+ Carbon today) reaches every CLI without a release. With the selector on, the
51
+ TUI /model picker, ACP model option and /model listing offer "Auto
52
+ (<model>)" first as the default. Bundled offline catalog adds Gemini 4
53
+ Carbon and mirrors the server defaults (Carbon for Balanced and Auto).
54
+ - Merge pull request #55 from
55
+ CopperPilot/fix/context_truncation_marker_12_nov_2026. [Aditya]
56
+
57
+ Keep the truncation marker inside the 64 KiB context message limit
58
+ - Merge pull request #52 from
59
+ CopperPilot/fix/headless_turn_resume_12_nov_2026. [Aditya]
60
+
61
+ Headless turns ride out long outages; per-streak resume budget; ACP unfinished-turn marker
62
+ - Headless turns ride out long outages; failure streaks reset after a
63
+ long connection; ACP marks unfinished turns. [AdityaNG]
64
+ - Merge pull request #50 from
65
+ CopperPilot/fix/dangerous_toggle_outside_workspace_11_nov_2026.
66
+ [Aditya]
67
+
68
+ YOLO and dangerous shell auto-allow cover outside-workspace commands
69
+ - Merge remote-tracking branch 'origin/main' into
70
+ fix/dangerous_toggle_outside_workspace_11_nov_2026. [AdityaNG]
71
+ - Merge pull request #51 from
72
+ CopperPilot/feat/raw_server_internal_reads_11_nov_2026. [Aditya]
73
+
74
+ Read server-internal files raw (purpose server_internal_text)
75
+ - Test: write the new netlist fixtures as bytes so Windows keeps LF.
76
+ [AdityaNG]
77
+ - Chore: update ty ignore comments for ty 0.0.101 (main CI has failed
78
+ since Nov 6) [AdityaNG]
79
+
80
+ unresolved-attribute was renamed missing-attribute, and the
81
+ invalid-assignment ignore in sessions.py is no longer needed.
82
+ - Fix(tools): YOLO and dangerous shell auto-allow cover outside-
83
+ workspace commands. [AdityaNG]
84
+
85
+ Outside-the-workspace shell commands asked in every mode, even YOLO and
86
+ Auto with always_allow_dangerous_shell_commands on. They now count as
87
+ dangerous shell commands: YOLO, or Auto with the dangerous switch, runs
88
+ them without a prompt (headless and MCP included). Otherwise they still
89
+ ask per call, with no session-wide allow, and are refused without an
90
+ approver.
91
+
92
+ Tests that would now really run grep / or killall -9 python3 stay in the
93
+ asking settings.
94
+
95
+
96
+ 1.0.1 (2026-11-06)
97
+ ------------------
98
+
99
+ Fix
100
+ ~~~
101
+ - Name what earlier attempts saw in a turn's final error. [AdityaNG,
102
+ Claude Opus 5.5]
103
+
104
+ During a hosted outage on 2026-10-30 (rea-hardware thin-laptop i12) every
105
+ attempt of a turn failed differently (dropped sockets, close code 1012
106
+ service restart, keepalive timeouts, HTTP 503 on reconnect, generic failed
107
+ finals), but the turn error only carried the last attempt's generic
108
+ "CopperPilot ran into an error. (... after N s ...)". The causes the
109
+ client did see never reached the caller.
110
+
111
+ When a turn fails after retries, its error now appends the earlier
112
+ attempts' failure type and message, or says all attempts failed the same
113
+ way.
114
+ - Do not double the period in the update notice. [AdityaNG, Claude Opus
115
+ 5.5]
116
+
117
+ A feature note that ends in a period printed 'shortcuts.. Run:'.
118
+ - Close the side-question review findings. [Cursor, Naveen_Copperpilot]
119
+
120
+ A side question that stops its own stream now reports the answer instead of a
121
+ connection error, a dropped question no longer keeps its request running, and
122
+ clearing the chat forgets the request the panel would show.
123
+ - Resume on a fresh hosted conversation when the service refuses it as
124
+ too large. [AdityaNG, Claude Opus 5.5]
125
+
126
+ validate arch.review on a large RK3566 tablet board ERRORed with "This
127
+ conversation is too large to continue". The review was not over-sized:
128
+ the hosted turn failed after 698 s of tool work (generic failed final),
129
+ the in-turn retry from #39 resumed on the same conversation id, and the
130
+ service refused that resume within 245 ms with 413 chat_request_too_large
131
+ because it judges the size of the history it stores per conversation,
132
+ not the request (a 190-byte repair prompt was refused the same way).
133
+
134
+ The stitched resume already carries its own transcript, so when the
135
+ service refuses a turn as too large (413 / chat_request_too_large, not
136
+ the client's own PAYLOAD_TOO_LARGE), the turn now continues once on a
137
+ fresh hosted conversation id. A second refusal still ends the turn.
138
+ - Retry a failed hosted final inside the turn and say what is known.
139
+ [AdityaNG, Claude Opus 5.5]
140
+
141
+ rea-hardware turns 5-30 min in ended with only "CopperPilot ran into an
142
+ error." and lost their work. The hosted service sends that as a failed
143
+ final (success false, zero tokens, no turn id); 5 of 6 sessions on
144
+ 2026-10-27 hit it after exactly 300 s of model silence (11 "Planning next
145
+ moves" heartbeats), i.e. the hosted model-call cap.
146
+
147
+ A failed final is now a retryable failed attempt (HOSTED_TURN_FAILED):
148
+ the existing stitched resume re-sends the partial transcript with backoff,
149
+ up to the usual 4 attempts, and the failed final is held back so a
150
+ recovered turn is not reported as an error. A final with tos_blocked is
151
+ not retried. When retries run out, the error names elapsed time, model,
152
+ content-policy block and turn id when the service sends them. The hosted
153
+ error copy echoed as text is kept out of the resume transcript.
154
+ - Wait until the loading spinner is removed after cancel. [Cursor,
155
+ Naveen_Copperpilot]
156
+
157
+ Scheduling the removal left the spinner mounted when the turn finished, so the interface still showed it as running.
158
+ - Finish turn cleanup when cancel lands during startup. [Cursor,
159
+ Naveen_Copperpilot]
160
+
161
+ A cancel while the spinner is still mounting skipped the turn's cleanup, so the turn never finished and the UI stayed busy.
162
+
163
+ Other
164
+ ~~~~~
165
+ - Release: version 1.0.1 🚀 [AdityaNG]
166
+ - Version inc. [AdityaNG]
167
+ - Merge pull request #48 from
168
+ CopperPilot/feat/harness_tools_over_scripts_4_nov_2026. [Aditya]
169
+
170
+ Tools over scripts: whole-file KiCad reads, read-only stock libraries, loud INCOMPLETE validate
171
+ - Test: read tests write their fixtures as bytes (Windows CRLF)
172
+ [AdityaNG]
173
+
174
+ On windows-latest, write_text turned the fixtures' newlines into CRLF and
175
+ the whole-file / paged read tests compared them with LF strings. The read
176
+ tools return the file's exact bytes (right for a CRLF checkout too), so
177
+ the fixtures are now written as bytes and a test pins byte-exactness with
178
+ a CRLF file.
179
+ - Merge remote-tracking branch 'origin/main' into
180
+ feat/harness_tools_over_scripts_4_nov_2026. [AdityaNG]
181
+
182
+ # Conflicts:
183
+ # tests/test_tools.py
184
+ - Merge pull request #49 from
185
+ CopperPilot/fix/cli_checkpoint_growth_5_nov_2026. [Aditya]
186
+
187
+ Sessions DB: compact event log, bounded checkpoints, threads compact-db
188
+ - Merge remote-tracking branch 'origin/feat/chat_compaction_4_nov_2026'
189
+ into fix/cli_checkpoint_growth_5_nov_2026. [AdityaNG]
190
+ - Feat(sessions): threads compact-db shrinks a database from an older
191
+ CLI. [AdityaNG]
192
+
193
+ Pruning per turn stops growth, but space already used stays in the file.
194
+ `copper-pilot threads compact-db [--dry-run] [-y]`:
195
+ - prunes every CopperPilot thread to its first and newest checkpoints
196
+ (threads another agent wrote are left alone)
197
+ - rewrites copper_events in the remaining checkpoints and writes to the
198
+ compact form
199
+ - VACUUMs only when the free space next to the database is at least its
200
+ size and twice its live data (the temporary copy goes there too);
201
+ otherwise it stops after pruning with a clear message
202
+ - never runs while a chat is open: chat runtimes hold a shared lock on
203
+ .sessions.db.open.lock and compact-db needs it exclusively (POSIX; on
204
+ Windows it relies on the prompt)
205
+ - --dry-run reports what would go and changes nothing
206
+ - Fix(sessions): keep only the newest checkpoints of a thread.
207
+ [AdityaNG]
208
+
209
+ Each turn writes three checkpoints and each holds the whole state, so a
210
+ thread's rows grew with the square of its turns and nothing pruned them.
211
+ - after every turn and state update the runtime deletes the thread's
212
+ older root-namespace checkpoints and their writes, keeping the first
213
+ (its writes hold the initial prompt) and the newest KEEP_CHECKPOINTS (3)
214
+ - nothing reads older ones: the CLI never time-travels and the turn
215
+ journal is a sidecar file; LangGraph's SQLite saver has no prune API, so
216
+ this deletes by checkpoint_id range under the saver's own lock
217
+ - one prune frees at most 256 MiB of checkpoints, so a large thread from
218
+ before is trimmed over a few turns instead of stalling one
219
+ - a failed prune is logged and never fails the turn
220
+ - Fix(sessions): store copper_events in a compact replay form.
221
+ [AdityaNG]
222
+
223
+ Every checkpoint row stores the whole state, and copper_events kept every
224
+ streamed frame (one per text chunk, plus tool arguments and results), so
225
+ each turn re-stored the thread's whole event history.
226
+ - drop text, tool_request and tool_result frames: the TUI never replays
227
+ them (they are in messages), and ACP, headless and MCP read messages only
228
+ - join consecutive reasoning chunks into one event, only where the TUI's
229
+ TurnState accepts every chunk; the joined event keeps the last sequence,
230
+ so replay renders the same text and ends in the same turn state
231
+ - keep every other event (status, todo_list, subagent, final, error,
232
+ compaction) unchanged; latest_todos and session_state read the same
233
+ - a thread stored before this is rewritten to the compact form once, on
234
+ its next turn (LangGraph Overwrite)
235
+ Tests compare the TUI's replay of a raw log with its compact form.
236
+ - Merge pull request #47 from
237
+ CopperPilot/feat/chat_compaction_4_nov_2026. [Aditya]
238
+
239
+ Chat context v1: pinned state, /compact, /context, ACP usage size (CLI + ACP)
240
+ - Merge remote-tracking branch 'origin/main' into
241
+ feat/chat_compaction_4_nov_2026. [AdityaNG]
242
+ - Fix(context): pin plans written to "/.copperpilot/..." on Windows.
243
+ [AdityaNG]
244
+
245
+ Deep Agents writes plans to workspace-rooted virtual paths. On Windows
246
+ "/.copperpilot/plans/x.plan.md" has no drive, so Path.is_absolute() is
247
+ False and joining it to the workspace landed on the drive root: the plan
248
+ was never pinned (3 tests failed on windows-latest only).
249
+ - Merge pull request #46 from
250
+ CopperPilot/feat/async_subagents_3_nov_2026. [Aditya]
251
+
252
+ Subagent status in the turn journal, concurrent agent lanes, bare resume intents
253
+ - Merge main into feat/async_subagents_3_nov_2026. [AdityaNG]
254
+ - Merge pull request #45 from
255
+ CopperPilot/feat/chat_resilience_resume_1_nov_2026. [Aditya]
256
+
257
+ Chat drops: keepalive, journaled turn resume, -r/`/resume`, ACP continue
258
+ - Test: the late background process outlives the first turn on slow
259
+ runners. [AdityaNG]
260
+
261
+ It slept 0.4 s, so on a loaded runner (ubuntu 3.13 on #46) it finished
262
+ before the first turn ended and no background_processes_waiting event was
263
+ emitted. It now sleeps 3 s.
264
+ - Test: Windows-safe outside-workspace guard tests, wait for TUI focus.
265
+ [AdityaNG]
266
+
267
+ The shell-scope and tools tests compared against POSIX display paths
268
+ ("/", "/usr", "~" for /home/maker). On Windows a drive-less root
269
+ resolves to the current drive ("D:\\"), so HOME and the expected reasons
270
+ now use the OS's absolute form; the tools tests expect the workspace
271
+ drive's root. The ask-user TUI test waits for focus instead of asserting
272
+ it right after one pause (flaky on windows-latest).
273
+ - Test: kill-by-name tests hold on Windows too. [AdityaNG]
274
+
275
+ The PID-kill run test used a POSIX shell line; on Windows (cmd.exe) it
276
+ runs the equivalent taskkill /PID. The classification tests use native
277
+ paths from the OS temp dir instead of the shared /home/maker fixture, so
278
+ they don't depend on the POSIX-path fix pending in #45.
279
+ - Fix(tools): ask before killing processes by name. [AdityaNG]
280
+
281
+ The agent ran `killall -9 python3` to stop its own background job and
282
+ killed every python3 of the user, the CLI itself included. Process
283
+ kills by name (killall, pkill incl. -f, killall5, taskkill /IM or /FI,
284
+ Stop-Process -Name, kill fed by pgrep/pidof/ps, kill -1, kill 0) now go
285
+ through the outside-the-workspace path: asked in every approval mode,
286
+ YOLO and Auto included, and refused in headless runs with the reason
287
+ and what to do instead (kill the PID of the process you started).
288
+ kill <PID> and taskkill /PID stay ordinary commands.
289
+ - Fix(tools): page big internal KiCad reads ourselves, outside the
290
+ workspace too. [AdityaNG]
291
+
292
+ A KiCad read too big for one frame fell back to Deep Agents' read_file,
293
+ which sees only the workspace: stock libraries such as Connector_Generic
294
+ (6.7 MB with JSON escaping) came back 'File not found', so placing a
295
+ header from it failed (tool-usage arm 4). Internal KiCad reads now return
296
+ the whole file raw when it fits, and otherwise raw frame-sized pages under
297
+ an '@@ lines a-b of N | next offset b @@' header, honouring offset/limit;
298
+ the server's bridge follows the pages.
299
+ - Workspace: never pick a project under .copperpilot. [AdityaNG]
300
+
301
+ Discovery walked into .copperpilot, so a downloaded reference project or a
302
+ staging copy could become the active design (fewest folders, then path
303
+ order) and its files used up the 2000-file scan budget. Ignore the folder
304
+ like the validate snapshot already does.
305
+ - Validate: name skipped checks in a loud INCOMPLETE line. [AdityaNG]
306
+
307
+ A tool-usage baseline agent ran validate with --skip pcb.drc (and every
308
+ other PCB stage), saw a clean-looking summary and reported "all
309
+ verification stages passing" on a board with 556 DRC errors. Print one
310
+ line, in the console summary and at the top of REPORT.md, that names each
311
+ skipped check and says the run does not show the design passes. Exit codes
312
+ are unchanged.
313
+ - Fix(tools): whole-file KiCad reads for the hosted bridge. [AdityaNG]
314
+
315
+ - read_file with a KiCad workspace purpose returns the whole file raw (no
316
+ 100-line window), like the desktop harness; files too big for one frame
317
+ fall back to the paged native read.
318
+ - read_binary_file reads bytes from disk instead of Deep Agents' 2000-line
319
+ text window, which cut text files silently and mangled unknown binaries.
320
+ - External reads are allowed only when flagged and only for KiCad library
321
+ files (.kicad_sym, .kicad_mod, 3D models); external writes stay blocked.
322
+ - Test(context): resume with a bare "Continue." (only bare resume
323
+ intents resume since #46 b5ebd2f) [AdityaNG]
324
+ - Feat(context): never compact while subagent workers are queued,
325
+ running or paused. [AdityaNG]
326
+
327
+ A resumed turn restarts unfinished async subagents from
328
+ .copperpilot/scratch/manifest.json and they need the uncompacted context.
329
+ - auto-compaction is skipped (logged, nothing shown) while any manifest
330
+ unit has status queued, running or paused
331
+ - manual /compact (TUI and ACP) warns with the worker count and compacts
332
+ only on a second /compact within 60 s
333
+ - a missing, unreadable or malformed manifest counts as no active workers
334
+ - Fix(context): count inline base64 images at a fixed cost, never send
335
+ them raw. [AdityaNG]
336
+
337
+ The model gets an inline data:image/...;base64 URI (the schematic
338
+ visualizer's <img>) as an image block, so chars/4 overstated it ~50x.
339
+ Estimates (context_estimate, the live-measurement remainder, now
340
+ pending_tokens) count each image as IMAGE_TOKENS = 1600. Compaction
341
+ context entries, tool digest excerpts, the interrupted-turn entry, the
342
+ pending query and earlier_user_messages replace image URIs with
343
+ [image], and search_chat_history neither matches nor snippets base64.
344
+ - Fix(context): estimate counts only content after the measurement.
345
+ [AdityaNG]
346
+
347
+ A turn's stored context usage recorded measured_at = len(original), the
348
+ messages before the turn, so the next estimate re-added the turn's own
349
+ answer (already in next_turn_tokens) and, for a resumed turn, its
350
+ "continue" messages. In cli-forced-2 the 339K-char answer of the resumed
351
+ u3 added ~85K tokens (estimate 234204 vs next_turn_tokens 149173).
352
+
353
+ measured_at is now the checkpoint length after the turn (state messages,
354
+ including continue messages, plus the turn's additions). A mid-turn
355
+ (live) measurement also stores the assistant text streamed after it as
356
+ pending_chars. An interrupted turn's journal usage covers the messages
357
+ present when it started. Tool messages are never counted.
358
+ - Fix(context): auto-compact a new turn that supersedes an interrupted
359
+ one. [AdityaNG]
360
+
361
+ A new message after an interrupted turn supersedes it (no longer
362
+ resumable), so the never-mid-turn rule no longer blocks compaction. The
363
+ pre-turn check now also runs there, after the interrupted turn's facts are
364
+ merged, measured from its carried context usage (next_turn_tokens when the
365
+ server sends it). The interrupted turn's work, which never reached the
366
+ checkpoint, goes into the compaction context as one assistant entry with
367
+ tool digests from its journal, and the pending message ends the context so
368
+ the server's cut keeps it. Resume attempts (/resume, -r, "continue")
369
+ still never compact, and session_state is still pinned after compaction.
370
+ - Test(context): history after interrupted turns: new message vs
371
+ continue. [AdityaNG]
372
+
373
+ Pins the #45 resume semantics behind the chat_context tap counts
374
+ [0, 1, 1, 1]: a new message after interrupted turns sends every earlier
375
+ user message, while a "continue …" message resumes the unfinished turn by
376
+ resending its original request.
377
+ - Fix(plans): parse agent-written plans with unquoted colons;
378
+ session_state never fails a turn. [AdityaNG]
379
+
380
+ Found in the live headless story: the agent wrote a plan whose todo text had
381
+ unquoted ': ' (invalid YAML), and every following turn crashed in
382
+ parse_plan via session_state with yaml.ScannerError. /build in the TUI and
383
+ ACP hit the same parser. Plain values are now quoted and re-parsed on a YAML
384
+ error, and a failure to build session_state sends {version: 1} with a
385
+ warning instead of failing the turn.
386
+ - Fix(context): keep interrupted turns' answers, todos, plan and size in
387
+ session_state. [AdityaNG]
388
+
389
+ An interrupted turn (Ctrl-C, SIGINT) cancels the graph node, so its
390
+ messages and copper_events never reach the checkpoint; only its turn
391
+ journal survives. The journal now also records the turn's latest todo list
392
+ and context usage. The next turn lifts the facts out of the abandoned
393
+ journal (ask_user_question answers incl. rejected/unanswered as skipped,
394
+ plan files written, todos, context size), carries them in its own journal
395
+ so consecutive interruptions chain, and stores them under
396
+ copper_interrupted_facts once a turn returns. session_state merges them by
397
+ transcript position and timestamp, deduplicated against the checkpoint.
398
+ - Feat(tui): /compact, context-aware /context and a ctx meter in the
399
+ status bar. [AdityaNG]
400
+
401
+ - status bar meter 'ctx 45% · 470K/1M' from stored usage, live
402
+ context_usage events and finals; warn/high/critical colours
403
+ - /compact [focus] runs manual compaction locally (refused mid-turn and
404
+ while a turn is unfinished) and prints a notice
405
+ - /context adds used/limit, auto-compacts-at and the compaction; counts the
406
+ context via the count endpoint when there is no fresh measurement
407
+ - printed notices for auto and in-turn compaction
408
+ - Feat(acp): /compact and /context commands, context usage_update with
409
+ size. [AdityaNG]
410
+
411
+ - advertise /compact (hint: optional focus) and /context; both answered
412
+ locally without a hosted chat turn
413
+ - usage_update{used: context_tokens, size: context_limit} from finals, live
414
+ context_usage events (throttled to 2 s), compaction and session/load;
415
+ billing token counts no longer drive the meter once context usage exists
416
+ - compaction progress and results as agent message text
417
+ - session/load notes a compacted chat
418
+ - Feat(context): pinned session state, compaction store and history
419
+ search. [AdityaNG]
420
+
421
+ Chat context protocol v1 on the CLI graph:
422
+ - ChatRequest.session_state snapshotted once per logical turn (ask answers,
423
+ latest todos, working plan, compaction summary and earlier user messages),
424
+ journaled with the compaction cut so every resume resends it unchanged
425
+ - copper_compaction / copper_compaction_superseded / copper_context_usage
426
+ checkpoint keys; context after the cut only; history_omitted reported
427
+ - auto-compaction before a new turn (never while a turn is unfinished),
428
+ in-turn compaction from status events or the final frame
429
+ - POST /analyze/compact and /analyze/context/count client with tool digests
430
+ - search_chat_history routed by the broker to the local transcript;
431
+ chat_history_search capability for checkpointed chats
432
+ - catalog context_window and context_policy parsing
433
+ - Fix(diagnostics): keep numeric log args numeric when redacting.
434
+ [AdityaNG]
435
+
436
+ RedactingFormatter turned every argument into a string, so any %d / %.1f
437
+ line written to the diagnostics file (e.g. "Chat turn finished ... wall=%.1fs")
438
+ raised "TypeError: must be real number, not str". Numbers and None now pass
439
+ through; everything else is still redacted, and mapping args are redacted
440
+ per value.
441
+ - Fix(resume): only a bare resume intent resumes the unfinished turn.
442
+ [AdityaNG]
443
+
444
+ A message like "continue, but use 0603 resistors" used to resume and drop
445
+ the instruction. Now only "continue", "resume", "/resume" and "continue
446
+ where you left off" (case and punctuation ignored) resume; anything with
447
+ extra text starts a new turn.
448
+ - Feat(protocol): run subagents' tool requests concurrently, one lane
449
+ per agent. [AdityaNG]
450
+
451
+ Tool requests tagged with agent_id ('main' or a subagent id) run on one
452
+ lane per agent: an agent's requests keep their order, different agents
453
+ run at the same time (they used to be awaited one by one, so parallel
454
+ subagents queued behind each other). Results stream back as they finish
455
+ and are all reported before the final; after a dropped socket the lanes
456
+ still finish so their results reach the journal. Approval prompts stay
457
+ one at a time (the broker's prompt lock). Untagged requests from older
458
+ servers are still awaited inline.
459
+ - Feat(resume): journal subagent status and send it on resume.
460
+ [AdityaNG]
461
+
462
+ Each subagent chip (unit, status, scratch folder) is kept in the turn
463
+ journal and returned in request.resume, matching the desktop client.
464
+ - Docs: outside-the-workspace shell approval. [AdityaNG, Claude Opus
465
+ 5.5]
466
+ - Tui: show the outside-the-workspace reason and drop the Auto option.
467
+ [AdityaNG, Claude Opus 5.5]
468
+
469
+ The approval menu adds a warning line with the reason and offers only yes
470
+ and no; the Auto shortcut is ignored for these prompts.
471
+ - Acp: carry the outside-the-workspace reason on permission requests.
472
+ [AdityaNG, Claude Opus 5.5]
473
+
474
+ The request title is prefixed with "Outside the workspace:", the reason is
475
+ in the tool-call content, and "Allow all for this session" is not offered,
476
+ so a YOLO session still asks for each such command and a stray
477
+ session-wide allow neither approves nor switches modes.
478
+ - Tools: ask before outside-the-workspace shell in every approval mode.
479
+ [AdityaNG, Claude Opus 5.5]
480
+
481
+ The broker classifies each execute request before the mode check. A flagged
482
+ command is sent to the approver even in Auto and YOLO, with the reason on
483
+ ApprovalRequest.outside_workspace, and approval is never cached. With no
484
+ approver (headless -n, MCP) it is refused with the tool error
485
+ "blocked: outside the workspace (<reason>); ask the user first". The
486
+ validate reviewer, which has no human, declines these requests.
487
+ - Shell: keep the temp-dir allowance from covering a sandboxed HOME.
488
+ [AdityaNG, Claude Opus 5.5]
489
+
490
+ A TMPDIR that contains the home directory would have allowed every path
491
+ under it, so it is skipped.
492
+ - Shell: classify agent commands that reach outside the workspace.
493
+ [AdityaNG, Claude Opus 5.5]
494
+
495
+ classify_outside_workspace(command, workspace_root, home) returns a short
496
+ reason for recursive searches rooted at /, a system top-level dir or a home
497
+ dir (find, grep -r, rg, fd, du, tree, ls -R), filesystem index searches,
498
+ paths under the home dir outside the workspace (KiCad locations, the CLI
499
+ home and TMPDIR excepted), and docker/podman/kubectl/sudo/ssh. It follows
500
+ &&/||/;/| chains, cd, $(...), sh -c and common wrappers. Commands seen in
501
+ long --yolo runs are flagged; relative and in-project commands are not.
502
+ - Graph: never resume a provider_busy pause before retry_after_s.
503
+ [AdityaNG, Claude Opus 5.5]
504
+
505
+ The jitter only adds up to 20% on top of the server's retry_after_s, so a
506
+ resume never lands earlier than the server asked.
507
+ - Docs: high-demand waits, provider_busy resumes and the capacity_wait
508
+ JSON event. [AdityaNG, Claude Opus 5.5]
509
+ - Acp: capacity waits and provider-busy pauses as progress thoughts.
510
+ [AdityaNG, Claude Opus 5.5]
511
+
512
+ capacity_wait events and provider-busy resume pauses become agent thought
513
+ lines ("High demand — waiting to continue (next try in N s)", "continuing
514
+ in N s"), which T3 Code shows as progress. A turn whose provider-busy
515
+ budget ran out ends like other unfinished turns, with high-demand copy and
516
+ the continue hint instead of the error wording.
517
+ - Tui: high-demand countdown for capacity waits and provider-busy
518
+ pauses. [AdityaNG, Claude Opus 5.5]
519
+
520
+ A capacity_wait shows "High demand — waiting to continue (next try in N s)"
521
+ on the working line with a live countdown and one toast per turn; a
522
+ provider-busy pause counts down "continuing in N s"; the next normal frame
523
+ clears it. When the provider-busy budget runs out the turn shows the
524
+ high-demand resume notice instead of an error.
525
+ - Headless: show capacity waits and provider-busy pauses; --json
526
+ capacity_wait lines. [AdityaNG, Claude Opus 5.5]
527
+
528
+ Text mode prints a yellow "High demand — waiting to continue (next try in
529
+ N s)" line per wait and "continuing in N s" for a provider-busy pause; a
530
+ turn whose provider-busy budget ran out prints the high-demand copy with the
531
+ -n -r resume command. --json emits {"type": "capacity_wait", ...} with the
532
+ event fields at the top level next to the turn ids and ts.
533
+ - Graph: wait out provider_busy finals on their own resume budget.
534
+ [AdityaNG, Claude Opus 5.5]
535
+
536
+ A provider_busy resumable final (the LLM provider stayed out of capacity for
537
+ the server's whole wait budget) no longer resends at once into an exhausted
538
+ quota. The turn waits retry_after_s (+/-20%, at least 15 s) and resumes from
539
+ the journal with reason provider_busy. These resumes have their own budget,
540
+ 6 in a row or 30 minutes per logical turn, and spend none of the transport
541
+ budget; any model progress starts a new streak. When the budget runs out
542
+ the turn ends manually resumable with high-demand copy instead of an error.
543
+
544
+ capacity_wait status events become copper.capacity_wait progress events
545
+ with a one-line high-demand title, and INFO logs (ids and timings only)
546
+ record each wait, pause, budget reset and stop. A resumable final's echoed
547
+ error copy is no longer streamed as answer text.
548
+ - Protocol: capacity_wait extends the idle bound; provider_busy finals
549
+ carry retry_after_s. [AdityaNG, Claude Opus 5.5]
550
+
551
+ A capacity_wait status event means the hosted model is waiting for LLM
552
+ provider capacity; the turn is healthy, so the next-frame bound grows by the
553
+ longer of the announced retry delay and the server's remaining wait budget
554
+ until a resumed or normal frame arrives. A provider_busy resumable final now
555
+ passes retry_after_s through and classifies as its own error type.
556
+ - Test: wire-level resume after a drop mid tool result. [AdityaNG,
557
+ Claude Opus 5.5]
558
+
559
+ A real agent and protocol stack over fake sockets: the second
560
+ chat_start resends the original query/context/effort with a new turn_id,
561
+ turn_resume_v1 and the journal (tool completed with its clipped result,
562
+ reason tool_result_undeliverable), and a repeated tool_call_id is
563
+ answered from the broker cache instead of running again.
564
+ - Acp: let the graph pick app_restart or manual for a resumed turn.
565
+ [AdityaNG, Claude Opus 5.5]
566
+ - Docs: turn durability, unfinished-turn resume, and --json turn fields.
567
+ [AdityaNG, Claude Opus 5.5]
568
+ - Acp: end an unfinished turn cleanly; "continue" resumes its journal.
569
+ [AdityaNG, Claude Opus 5.5]
570
+
571
+ When automatic resumes run out, the prompt now ends with stop reason
572
+ max_turn_requests and a message naming the last error and how to
573
+ continue, instead of a JSON-RPC error. Usage-limit and auth failures
574
+ keep their existing errors. The next "continue …" prompt (also inside a
575
+ T3 Code <user_request> envelope) or /resume (advertised as a command)
576
+ resumes the unfinished turn from its journal instead of sending
577
+ "continue" as a new request; with no unfinished turn, "continue" is a
578
+ normal prompt. Server restarts and socket rotations show a thought line.
579
+ - Tui: offer /resume for an unfinished turn. [AdityaNG, Claude Opus 5.5]
580
+
581
+ Opening a thread whose last turn did not finish (crash, quit, Ctrl-C,
582
+ exhausted auto-resumes) shows a notice with the query, the recorded tool
583
+ calls and the last error category. /resume now continues that turn from
584
+ its journal; with no unfinished turn it still opens the thread picker
585
+ (/threads and Ctrl+R are unchanged). A "continue" message does the same
586
+ through the graph. Resume progress updates the status line, and a turn
587
+ that stops unfinished shows the same affordance inline.
588
+ - Headless: -n -r resumes the unfinished turn; JSON events carry turn
589
+ ids. [AdityaNG, Claude Opus 5.5]
590
+
591
+ - `copper-pilot -n -r [thread]` without --message resumes that thread's
592
+ unfinished turn (crash, Ctrl-C, exhausted auto-resumes) with its
593
+ journal; it exits 2 with a clear message when there is none. A turn
594
+ that stops unfinished prints the exact command to resume it.
595
+ - `--json` lines keep type/data/title and add turn_id, root_turn_id,
596
+ resume_attempt (client resume count) and ts (epoch seconds), plus
597
+ sequence and server_resume_attempt when the frame carried them.
598
+ copper.resume events surface as type "resume" with attempt, reason,
599
+ delay_s and will_retry.
600
+ - Graph: resume dropped turns from a client-side journal. [AdityaNG,
601
+ Claude Opus 5.5]
602
+
603
+ The copper_pilot node now keeps a journal of each logical turn (original
604
+ request, assistant text, tool calls with completed/failed/interrupted
605
+ outcomes) and resumes a dropped attempt by resending the ORIGINAL request
606
+ with a new turn_id and request.resume, instead of the stitched transcript
607
+ plus "Resume where we left off" prose. The prose path stays behind
608
+ COPPER_PILOT_TURN_RESUME=0 for servers without turn_resume_v1.
609
+
610
+ Retry policy (protocol v1): up to 8 automatic resumes or 10 min of
611
+ recovery per logical turn, backoff 1,2,5,10,20,30,60,60 s with +-20%
612
+ jitter, and a GET /api/heartbeat wait before each resume that does not
613
+ use an attempt. A resumable final (server_restarting/socket_rotation)
614
+ resumes after 0-2 s outside the error budget, capped at 20 resumes.
615
+ Later attempts keep the broker's tool-result cache.
616
+
617
+ The journal is rewritten to a sidecar file while the turn runs and kept
618
+ in the checkpoint (copper_turn_journal) when the turn ends unfinished,
619
+ so a crash, Ctrl-C or exhausted budget can be resumed with
620
+ copper_resume input or a "continue" message. Events carry root_turn_id,
621
+ turn_attempt and ts; copper.resume reports each resume. INFO logs record
622
+ drops (close code, attempt, elapsed), resume start/success and turn
623
+ completion (wall time, attempts, tool counts), without content.
624
+ - Protocol: keepalive, 330 s idle bound, and a reader that never stops.
625
+ [AdityaNG, Claude Opus 5.5]
626
+
627
+ Turn resume protocol v1, transport side:
628
+
629
+ - ping_interval=15 / ping_timeout=20 on the chat socket; the idle bound
630
+ drops to 330 s (longer than the server's 300 s quiet timeout) and an
631
+ idle socket is closed with 4000 client_liveness_timeout.
632
+ - A reader task drains the socket for the whole turn, so frames and the
633
+ library's pong handling keep flowing while a long local tool runs.
634
+ Frames are still processed in order, one tool step at a time.
635
+ - A tool result whose socket is gone is still reported (delivered=false)
636
+ instead of being dropped, including the rest of a running batch.
637
+ - chat_start carries turn_id, request.resume, and advertises
638
+ turn_resume_v1; final frames surface resumable/error_code.
639
+ - Drops carry close code/reason and a resume reason; heartbeat() probes
640
+ GET /api/heartbeat.
641
+ - turn_journal.py holds the client-side journal and its sidecar store.
642
+ - Merge pull request #44 from CopperPilot/fix/turn-error-attempt-
643
+ history. [Aditya]
644
+
645
+ fix: name what earlier attempts saw in a turn's final error
646
+ - Validate: connector_edge reads role-named references like J_ETH (#43)
647
+ [Aditya, Claude Opus 5.5]
648
+
649
+ Agents often name connectors by role (J_ETH, J_USBA, J_HDMI) instead of
650
+ J1, J2. The reference pattern required a digit right after the prefix, so
651
+ those parts were never checked and the check passed with "0 external
652
+ connector(s) checked" on a board whose USB-C and micro-HDMI face inward.
653
+ Accept a separator after the prefix too; JMP_EMMC still doesn't match.
654
+ - Validate: ungated connector-edge and 3D-model checks; agent shell
655
+ finds CLI tools (#42) [Aditya, Claude Opus 5.5]
656
+
657
+ Add two deterministic, no-LLM builtin checks that run even after a stage
658
+ gate halts the run (new `ungated: true` check field):
659
+
660
+ - pcb.connector_edge (S5): external connectors (USB, RJ45, HDMI, DP, DVI,
661
+ barrel/audio jacks, D-Sub) must sit on the board edge with the mating
662
+ face pointing out. The face direction comes from the pad centroid to the
663
+ Fab/courtyard body centre (or a "PCB Edge" drawing note), rotated into
664
+ the board frame, and is ray-cast against Edge.Cuts. Inward, sideways or
665
+ inboard connectors are P1, set-back ones P2. Headers, board-to-board,
666
+ vertical and ambiguous parts are not judged.
667
+ - pcb.models_3d (S2): every footprint (model ...) path must resolve
668
+ (${KIPRJMOD}, ${KICADn_3DMODEL_DIR} for any version, KiCad's configured
669
+ path variables, the system 3D directory next to kicad-cli, project-
670
+ relative paths). Missing files are P1; bodies with no model are P2.
671
+
672
+ parts.footprints no longer rates a missing 3D model as P3.
673
+
674
+ Agent shell commands now append the CLI environment's scripts folder to
675
+ PATH, so tools installed alongside the CLI by pipx or `uv tool` (e.g.
676
+ easyeda2kicad) are runnable without shadowing the user's own python.
677
+ easyeda2kicad is offered as the optional `easyeda` extra because it is
678
+ AGPL-3.0, which the CI license gate rejects in the default install.
679
+ - Merge pull request #38 from naveen-forkd/feat/cli-self-update.
680
+ [Aditya]
681
+
682
+ Add a self-update command and one-line feature notices
683
+ - Merge main (with /btw) into feat/cli-self-update. [AdityaNG, Claude
684
+ Opus 5.5]
685
+ - Merge pull request #36 from naveen-forkd/feat/btw-side-questions.
686
+ [Aditya]
687
+
688
+ Add /btw side questions that do not interrupt the running turn
689
+ - Docs: note that long btw answers are shortened in the panel. [Cursor,
690
+ Naveen_Copperpilot]
691
+ - Perf: ask side answers to stay brief. [Cursor, Naveen_Copperpilot]
692
+ - Perf: cap the lines rendered in the btw panel. [Cursor,
693
+ Naveen_Copperpilot]
694
+ - Perf: skip re-rendering an unchanged btw answer. [Cursor,
695
+ Naveen_Copperpilot]
696
+ - Docs: document /btw side questions. [Cursor, Naveen_Copperpilot]
697
+ - Test: cover /btw panel, keys and turn isolation in the tui. [Cursor,
698
+ Naveen_Copperpilot]
699
+ - Test: cover side question builder, runner and log. [Cursor,
700
+ Naveen_Copperpilot]
701
+ - Test: refresh chrome snapshots for /btw. [Cursor, Naveen_Copperpilot]
702
+ - Feat: list /btw in slash commands and key help. [Cursor,
703
+ Naveen_Copperpilot]
704
+ - Feat: wire /btw command into the app. [Cursor, Naveen_Copperpilot]
705
+ - Feat: let esc close the btw panel before stopping the turn. [Cursor,
706
+ Naveen_Copperpilot]
707
+ - Feat: add btw panel widget. [Cursor, Naveen_Copperpilot]
708
+ - Feat: run side questions on a tool-less hosted stream. [Cursor,
709
+ Naveen_Copperpilot]
710
+ - Feat: add side question log and request builder. [Cursor,
711
+ Naveen_Copperpilot]
712
+ - Merge pull request #41 from CopperPilot/fix/resume-on-fresh-
713
+ conversation. [Aditya]
714
+
715
+ fix: resume on a fresh hosted conversation when the service refuses it as too large
716
+ - Merge pull request #39 from CopperPilot/fix/retry-hosted-failed-final.
717
+ [Aditya]
718
+
719
+ fix: retry a failed hosted final inside the turn and say what is known
720
+ - Test: prove batched reads overlap instead of timing them. [Cursor,
721
+ Naveen_Copperpilot]
722
+
723
+ A wall-clock cutoff of half a second failed when CI was only slightly slower than the ideal overlap, even though the reads still ran together.
724
+ - Test: cover self-update behavior and document the command. [Cursor,
725
+ Naveen_Copperpilot]
726
+
727
+ Record the check, confirmation, and notice rules so a release cannot announce more than one feature line.
728
+ - Feat: show feature update notices inside the app. [Cursor,
729
+ Naveen_Copperpilot]
730
+
731
+ Textual captures stderr while the interface is open, so show the one-line notice in the app and keep tests off the network.
732
+ - Feat: add a confirmed package-manager update command. [Cursor,
733
+ Naveen_Copperpilot]
734
+
735
+ Let users check or apply an update through pipx or the active environment, without replacing an editable checkout.
736
+ - Feat: resolve a one-line feature notice from PyPI. [Cursor,
737
+ Naveen_Copperpilot]
738
+
739
+ Keep update checks throttled and fail-open, and publish only a validated one-line feature note with each release.
740
+
741
+
742
+ 1.0.0 (2026-10-27)
743
+ ------------------
744
+
745
+ Fix
746
+ ~~~
747
+ - Do not count echoed request fields toward the stream byte budget.
748
+ [AdityaNG, Claude Opus 5.5]
749
+
750
+ The hosted service echoes the request `query` (and, in the final frame,
751
+ `context`) in every chat_response. A live probe showed the echo is ~97% of
752
+ each frame. A validate arch.review prompt is ~76 KB, so a long review on a
753
+ large board crossed the 64 MiB client budget after ~815 frames (2601 s)
754
+ although the hosted output itself was ~4.4 MB, and the check ERRORed with
755
+ "Chat exceeded the client stream byte budget."
756
+
757
+ The budget now counts frame bytes minus the echoed request fields the
758
+ client never reads, and the error names the counted size and frame count.
759
+ - Stop cutting long hosted answers at the 16 KB status limit. [AdityaNG,
760
+ Claude Opus 5.5]
761
+
762
+ Every hosted response frame went through sanitize_status, which caps
763
+ status lines at 16 KB. The hosted side can send a whole answer as one
764
+ response frame, so a validate review longer than 16 KB lost the end of
765
+ its findings JSON. The reviewer then found no json block, sent a repair
766
+ turn into the already huge thread, and the server refused it ("This
767
+ conversation is too large to continue"), so arch.review ERRORed. Chat
768
+ and ACP answers over 16 KB were cut the same way.
769
+
770
+ Response text now gets a 1 MiB bound; status and reasoning lines keep
771
+ 16 KB. A validate check that fails with a hosted failed final also
772
+ records the hosted turn id, as chat does.
773
+ - Surface stalled or failed hosted turns instead of hanging. [AdityaNG,
774
+ Claude Opus 5.5]
775
+
776
+ Three ways a long ACP turn could hang or hide its cause:
777
+
778
+ - idle_frame_timeout was None, so a hosted server that kept the socket
779
+ (and keepalive) up but stopped sending hung the prompt forever. It now
780
+ defaults to 10 minutes (COPPER_PILOT_IDLE_TIMEOUT_SECONDS, 0 disables)
781
+ and raises the existing retryable CHAT_IDLE_TIMEOUT with the silence
782
+ length in the message. The hosted side heartbeats every 25 s.
783
+ - A failed hosted final (success false) still waited, unbounded, for
784
+ background shells and then ran a continuation turn. A runaway background
785
+ command held the hosted error back until the caller timed out, and a
786
+ continuation that succeeded still reported the stale error. A failed
787
+ final now ends the turn and kills leftover background processes.
788
+ - The hosted copy "CopperPilot ran into an error." carries no detail. The
789
+ ACP error now names the hosted turn id, and the client logs the failing
790
+ final frame's keys, so the server-side cause can be found.
791
+ - Guard the state lock with sys.platform so ty passes on Windows.
792
+ [AdityaNG, Claude Opus 5.5]
793
+ - Stop concurrent sessions racing on recent-projects state. [AdityaNG,
794
+ Claude Opus 5.5]
795
+
796
+ Every process wrote recent-projects.json (and config.json) through the
797
+ same fixed temp name, so parallel `copper-pilot acp` session starts moved
798
+ or clobbered each other's temp file and session/new failed with
799
+ FileNotFoundError on os.replace.
800
+
801
+ Writes now go through a per-write mkstemp temp file, the recent-projects
802
+ read-modify-write holds a POSIX flock so no entry is dropped, and the
803
+ bookkeeping logs instead of raising so it can never fail a session.
804
+
805
+ Other
806
+ ~~~~~
807
+ - Release: version 1.0.0 🚀 [AdityaNG]
808
+ - Merge pull request #37 from CopperPilot/fix/stream-byte-budget.
809
+ [Aditya]
810
+
811
+ fix: do not count echoed request fields toward the stream byte budget
812
+ - Merge pull request #35 from CopperPilot/fix/long-response-truncation.
813
+ [Aditya]
814
+
815
+ fix: stop cutting long hosted answers at the 16 KB status limit
816
+ - Merge pull request #33 from CopperPilot/fix/hosted-stream-stall.
817
+ [Aditya]
818
+
819
+ fix: surface stalled or failed hosted turns instead of hanging
820
+ - Merge pull request #34 from CopperPilot/fix/validate-hierarchical-
821
+ nets. [Aditya]
822
+
823
+ fix(validate): ground findings that cite label names of hierarchical nets
824
+ - Fix(validate): ground findings that cite label names of hierarchical
825
+ nets. [AdityaNG, Claude Opus 5.5]
826
+
827
+ KiCad names local and hierarchical label nets with their sheet path
828
+ ("/RAIL_IO_3", "/power/RAIL_IO_3"), but reviewers cite the label
829
+ ("RAIL_IO_3"). Grounding compared the cited name to the full net name
830
+ only, so every real finding on such a board was marked UNGROUNDED and
831
+ could never fail a blocking check (WARN / exit 3 instead of FAIL).
832
+
833
+ A cited net now grounds when it equals a design net name or is a
834
+ "/"-boundary suffix of one; invented names still do not.
835
+ - Merge pull request #32 from CopperPilot/fix/recent-projects-race.
836
+ [Aditya]
837
+
838
+ fix: stop concurrent ACP sessions racing on recent-projects state
839
+
840
+
841
+ 0.1.11 (2026-10-25)
842
+ -------------------
843
+
844
+ Fix
845
+ ~~~
846
+ - Do not block turn cancellation on loading-widget removal. [Cursor,
847
+ Naveen_Copperpilot]
848
+
849
+ Textual defers widget pruning to its message loop. Awaiting that removal during a cancelled turn could leave the turn task pending on Windows, so the cancellation cleanup test timed out.
850
+ - Require Pillow 13 so the security audit passes. [Cursor,
851
+ Naveen_Copperpilot]
852
+
853
+ Pillow 12.3.0 is the newest release the old pin allowed, and pip-audit fails the CI job on four advisories fixed in 13.0.0.
854
+ - Tell the type checker these widgets are Static. [Cursor,
855
+ Naveen_Copperpilot]
856
+
857
+ query() is typed as a generic widget, so ty rejected update() on the working line, the mode icon, and the input rules. CI stopped there before the tests ran.
858
+ - Retry a reconnect the server refuses with HTTP 503. [AdityaNG, Claude
859
+ Fable 5.1]
860
+
861
+ Every "server rejected WebSocket connection: HTTP 503" failure seen from
862
+ T3 Code follows the same sequence: the hosted pod restarts mid-stream
863
+ (no close frame), the stitched resume reconnects 5 s later while the
864
+ backend is still coming back, and the load balancer answers the upgrade
865
+ with 503. websockets raises InvalidStatus for that, which classify_error
866
+ did not know, so the turn was typed "unknown", non-retryable, and the
867
+ remaining attempt was never used.
868
+
869
+ - classify InvalidStatus by HTTP status (5xx/429 retry; auth and other
870
+ 4xx fail fast) and InvalidHandshake without a status as a connection
871
+ drop
872
+ - include InvalidHandshake in the transport's pre-first-event retry
873
+ - stretch the turn budget to four attempts (5/10/20/30 s) so it outlasts
874
+ a typical pod restart
875
+ - regression tests for the drop-then-503 sequence and the transport retry
876
+
877
+ Other
878
+ ~~~~~
879
+ - Release: version 0.1.11 🚀 [AdityaNG]
880
+ - Merge pull request #31 from naveen-
881
+ forkd/feat/cli_chat_chrome_2026_10_24. [Aditya]
882
+
883
+ Redraw the CLI chat screen, add themes, and make typing faster
884
+ - Test: wait until a tool is active before cancelling. [Cursor,
885
+ Naveen_Copperpilot]
886
+ - Test: wait for the loading widget to leave after cancel. [Cursor,
887
+ Naveen_Copperpilot]
888
+
889
+ Textual drops the widget on a later prune tick, so an immediate check still sees it on Windows.
890
+ - Test: run the suite in a UTF-8 locale. [Cursor, Naveen_Copperpilot]
891
+
892
+ Windows CI has no UTF-8 locale, so the app drew the ASCII fallback and the Unicode snapshots failed. The suite now sets a UTF-8 locale, and a test still checks that a C locale or COPPERPILOT_ASCII selects the fallback.
893
+ - Test: cover theme switching and the input hot path.
894
+ [Naveen_Copperpilot]
895
+
896
+ Check the presets, /theme persistence, idle typing, the pruned file index, and streamed Markdown that keeps closed blocks.
897
+ - Perf: keep typing, file completion, and streaming off the hot path.
898
+ [Naveen_Copperpilot]
899
+
900
+ Skip completion repaints when the matches did not change, and apply a pending @ filter before tab or enter. Build the file list in the background, skip ignored folders, and refresh it when it is stale. Append assistant Markdown only while a block is still open, so a finished paragraph or code fence is not replaced.
901
+ - Perf: import deepagents the first time a tool runs.
902
+ [Naveen_Copperpilot]
903
+
904
+ Opening the UI was paying for the tool stack at import. Load it on the first tool call instead.
905
+ - Test: keep the saved theme out of the suite. [Naveen_Copperpilot]
906
+
907
+ Point each test at a temporary CLI home and reset the shared palette. Live tests keep the real home so they can still load the device credential.
908
+ - Feat: let /theme switch presets and remember the choice.
909
+ [Naveen_Copperpilot]
910
+
911
+ /theme opens a picker or takes a name, writes it to config.json, and repaints the chrome that bakes colours into text.
912
+ - Feat: make near-black the default and add theme presets.
913
+ [Naveen_Copperpilot]
914
+
915
+ The warm stone background is now one preset. Black is the default, with warm, light, and high-contrast beside it. Snapshot colours read the active tokens, and the locale encoding is cached so glyph checks do not call locale.getencoding on every paint.
916
+ - Feat: redraw the prompt and bind shift+tab and ctrl+e.
917
+ [Naveen_Copperpilot]
918
+
919
+ Rules replace the rounded box, and one tip sits above them until the first message. shift+tab and ctrl+e were taken by focus movement and end-of-line, so those bindings now take priority and cycle mode and effort while the prompt is focused.
920
+ - Feat: replace the boxed header with a flat welcome and one status
921
+ line. [Naveen_Copperpilot]
922
+
923
+ Drop version, full path, and model from the header. Show the wordmark, repo, and quick start, and put mode and effort on the line under the prompt.
924
+ - Feat: add the plain-text layout for the chat chrome.
925
+ [Naveen_Copperpilot]
926
+
927
+ Welcome, status, slash rows, the working line, and tips are content the widgets render. Only commands, modes, and keys the CLI already has are included.
928
+ - Feat: draw the CopperPilot cube as a Braille mark.
929
+ [Naveen_Copperpilot]
930
+
931
+ Six rows of thirteen cells, one orange. The welcome omits it when the terminal is narrow, uncolored, or ASCII.
932
+ - Feat: switch the CLI theme to the warm orange palette.
933
+ [Naveen_Copperpilot]
934
+
935
+ One orange and warm neutrals, with the same layout in truecolor, 256-color, and NO_COLOR. Status green and red stay limited to tool results.
936
+ - Merge pull request #27 from
937
+ CopperPilot/feat/disable_model_selector_19_oct_2026. [Aditya]
938
+
939
+ feat: hide Intelligence model selection behind ENABLE_MODEL_SELECTOR (off)
940
+ - Feat: hide Intelligence model selection behind ENABLE_MODEL_SELECTOR
941
+ (off) [AdityaNG, Claude Opus 5.5]
942
+
943
+ Add ENABLE_MODEL_SELECTOR to copper_models, set to False. While it is off
944
+ no surface names a model or offers a choice, and every Intelligence turn
945
+ asks for the default model (Gemini 4 Argon), including threads saved with
946
+ another model. Balanced still sends no model. No server change.
947
+
948
+ - TUI: no /model command or completion, /context and /help omit the model.
949
+ - Headless: --model is not registered.
950
+ - MCP: no models tool, the model argument is dropped from the ask/plan/
951
+ run/resume schemas, and results omit model/answered_model.
952
+ - ACP: only mode and effort config options, no /model command, a model
953
+ config change is rejected, and effort copy names no model.
954
+ - Fallback notices use a generic "switched to a backup model" message.
955
+
956
+ Flipping the constant to True restores the previous behaviour; the
957
+ existing model-selection tests run with it on via a fixture.
958
+ - Merge pull request #28 from
959
+ CopperPilot/feat/agent_latency_cli_19_oct_2026. [Aditya]
960
+
961
+ Run tool_requests batches concurrently (parallel_tool_requests capability)
962
+ - Keep batched tool calls on one assistant message; test ACP overlap.
963
+ [AdityaNG, Claude Opus 5.5]
964
+
965
+ The transcript records a batch's calls on a single AIMessage so every
966
+ call is followed by its result whatever the completion order. ACP already
967
+ keys tool_call / tool_call_update by id; a test now covers three
968
+ overlapping calls completing out of order.
969
+ - Execute tool_requests batches concurrently over the chat socket.
970
+ [AdityaNG, Claude Opus 5.5]
971
+
972
+ chat_start advertises the parallel_tool_requests capability (disable with
973
+ COPPER_PILOT_PARALLEL_TOOLS=0). A batch frame yields one TOOL_REQUEST per
974
+ call, runs them with the scheduler and sends each tool_result, matched by
975
+ tool_call_id, as soon as it completes. Single tool_request frames are
976
+ unchanged. The hosted attempt is now closed deterministically so a
977
+ consumer that stops listening cancels running batch members, and the
978
+ local broker serializes approval and question prompts.
979
+ - Add a scheduler for parallel tool-request batches. [AdityaNG, Claude
980
+ Opus 5.5]
981
+
982
+ Classifies each hosted tool request as READ, MUTATING (keyed by path) or
983
+ EXCLUSIVE and runs a batch with model-order dependencies: reads overlap
984
+ (capped at 8), same-path mutations run in order, shell commands that are
985
+ not provably read-only run alone. Failures are reported per tool and
986
+ closing the batch cancels unfinished members.
987
+ - Merge pull request #26 from CopperPilot/feat/acp-usage-limit-reset.
988
+ [Aditya]
989
+
990
+ feat(acp): explain usage limits with their reset time
991
+ - Merge remote-tracking branch 'origin/main' into feat/acp-usage-limit-
992
+ reset. [AdityaNG]
993
+
994
+ # Conflicts:
995
+ # docs/cli.md
996
+ # src/copper_pilot_cli/copper_acp.py
997
+ # tests/test_acp.py
998
+ - Merge pull request #25 from CopperPilot/t3/intelligence-mode-model-
999
+ selection. [Aditya]
1000
+
1001
+ feat: Intelligence model selection across TUI, CLI, MCP, and ACP
1002
+ - Feat: default Intelligence to Gemini 4 Argon, Gemini models first.
1003
+ [AdityaNG, Claude Fable 5.1]
1004
+
1005
+ Mirror copper-pilot-client #98: the bundled catalog now lists the Gemini
1006
+ models first and defaults Intelligence to gemini-4-argon. The server's
1007
+ catalog order and default still win whenever it is reachable.
1008
+ - Feat: Intelligence model selection across TUI, CLI, MCP, and ACP.
1009
+ [AdityaNG, Claude Fable 5.1]
1010
+
1011
+ Mirror the desktop client's Intelligence model picker (copper-pilot#97):
1012
+ Balanced always runs on the server's Balanced model; Intelligence turns
1013
+ may pick one model from the hosted catalog (Claude Opus 5.5 default).
1014
+
1015
+ - copper_models: catalog fetched once per process from
1016
+ GET /api/copperpilot/chat/models with the bundled list as fallback,
1017
+ plus model_fallback status-event helpers.
1018
+ - ChatRequest.model is sent only on Intelligence turns; the thread
1019
+ checkpoint persists copper_model next to copper_effort.
1020
+ - CLI --model (implies --effort intelligence), TUI /model and /context,
1021
+ and model_fallback notices in the transcript and headless output.
1022
+ - MCP: model argument on ask/plan/run/resume, a models tool, and
1023
+ model/answered_model in results and the digest.
1024
+ - ACP: a model config option (category model) next to effort
1025
+ (thought_level); choosing a model selects Intelligence, Balanced pins
1026
+ the option to the Balanced model, /model slash command, and fallback
1027
+ notices as agent messages.
1028
+ - Test(acp): accept a usage reset that falls after midnight. [AdityaNG,
1029
+ Claude Opus 5.5]
1030
+ - Feat(acp): explain usage limits with their reset time. [AdityaNG,
1031
+ Claude Opus 5.5]
1032
+
1033
+ A turn refused by the usage window or weekly limit reached ACP clients as a
1034
+ generic -32603 error whose text carried a raw UTC timestamp, or for a refused
1035
+ handshake only "HTTP 402".
1036
+
1037
+ - Keep the reset time from the hosted error frame's detail
1038
+ (window_ends_at / week_ends_at) on ProtocolError and the error event.
1039
+ - ACP fails such a turn with code -32003 and a message naming the spent
1040
+ limit and its local reset time ("It resets at 3:20 AM (in 2h 23m).");
1041
+ data carries class=usage_limit, blockReason and resetAt. Without a reset
1042
+ time in the frame, the token-limits endpoint fills it in; a bare 402 the
1043
+ account view does not confirm (the Intelligence plan gate) is unchanged.
1044
+ - The graph keeps a refused handshake's HTTP status on its error event.
1045
+ - ACP drops the terminal "Attempt N failed" thought that repeated the error.
1046
+ - New ACP /usage command shows the window, weekly balance and reset times.
1047
+ - The TUI renders usage blocks with the same local reset time.
1048
+ - Merge pull request #24 from CopperPilot/fix/retry-refused-handshake.
1049
+ [Aditya]
1050
+
1051
+ fix: retry a reconnect the server refuses with HTTP 503
1052
+
1053
+
1054
+ 0.1.10 (2026-10-18)
1055
+ -------------------
1056
+
1057
+ Fix
1058
+ ~~~
1059
+ - Skip the killed-background resume test on Windows. [AdityaNG, Cursor]
1060
+
1061
+ os.killpg is POSIX-only, and that failure was the Windows CI break.
1062
+ - Resume the agent when a background shell already exited. [AdityaNG,
1063
+ Cursor]
1064
+
1065
+ The continuation turn only ran while a background command was still alive, so a search that finished during the rest of the turn never woke the agent.
1066
+
1067
+ Other
1068
+ ~~~~~
1069
+ - Release: version 0.1.10 🚀 [AdityaNG]
1070
+ - Merge pull request #23 from CopperPilot/feat/acp-image-prompts.
1071
+ [Aditya]
1072
+
1073
+ feat(acp): accept image prompts
1074
+ - Feat(acp): accept image prompts. [AdityaNG, Cursor]
1075
+
1076
+ T3 Code refused to start any ACP turn that carried an image because initialize never advertised promptCapabilities.image, and prompt() dropped image blocks anyway. Advertise image support, save each image block under .copperpilot/attachments, pass it as a path-first runtime attachment like the TUI does, and list the saved paths in the query so the agent reads the workspace copy.
1077
+ - Merge pull request #22 from CopperPilot/fix/resume-finished-
1078
+ background-shell. [Aditya]
1079
+
1080
+ fix: resume the agent when a background shell already exited
1081
+ - Merge pull request #21 from CopperPilot/feat/validate. [Aditya]
1082
+
1083
+ feat: copper-pilot validate, a stage-gated read-only review graph
1084
+ - Fix(validate): default reviewers to agent mode and pass Windows CI.
1085
+ [AdityaNG, Cursor]
1086
+
1087
+ Agent mode is the better default for hosted reviewers; the read-only broker still blocks design writes. Windows treated POSIX virtual paths and library URIs as relative, and os.kill(SIGTERM) aborted pytest before it could report.
1088
+ - Fix(validate): enforce reviewer.timeout_s and treat SIGTERM like
1089
+ Ctrl-C. [AdityaNG, Claude Fable 5.1]
1090
+
1091
+ A hosted architecture review on a 68-part board outlived an external
1092
+ timeout(1) wrapper; SIGTERM killed the process with no report, and the
1093
+ graph's reviewer.timeout_s had never been applied. Each reviewer slice now
1094
+ runs under asyncio.timeout(reviewer.timeout_s) and times out as an ERROR,
1095
+ and the CLI maps SIGTERM onto the same partial-report path as Ctrl-C.
1096
+ - Fix(validate): scope release.repo to the project folder; tolerate
1097
+ markdown escapes in replies. [AdityaNG, Claude Fable 5.1]
1098
+
1099
+ Running validate on a repository that keeps generated boards outside the
1100
+ KiCad project (video/build/tmp_pcbs) counted them as portability failures.
1101
+ The workspace walker now skips the same build/dist/node_modules folders as
1102
+ discover_workspace, and release.repo only scans the project folder.
1103
+
1104
+ A live sch.ratings reviewer wrote '\*' inside JSON strings, which is not a
1105
+ JSON escape and cost a repair turn; invalid escapes are now dropped before
1106
+ the repair path is used.
1107
+ - Feat(validate): explain, --context, Python validate() API, and live
1108
+ test. [AdityaNG, Claude Fable 5.1]
1109
+
1110
+ Add copper-pilot validate explain CHECK_ID (config, rendered prompt, input
1111
+ hashes, last result), --context FILE ... (appended to every reviewer prompt
1112
+ under Reference material and folded into the cache key), the
1113
+ copper_pilot_cli.validate.validate()/avalidate() API returning a
1114
+ ValidationReport, and a pytest -m live end-to-end run of validate --until S2
1115
+ on examples/001_esp32.
1116
+ - Feat(validate): --json events, --junit, --emit-fix-prompt, MCP
1117
+ validate tool, skill and docs. [AdityaNG, Claude Fable 5.1]
1118
+
1119
+ Stream validate.start/check/result/end events (plus copper.retry pass-through)
1120
+ with --json, write JUnit XML with --junit (FAIL/ERROR -> failure/error,
1121
+ SKIPPED -> skipped naming the blocker, WARN -> system-out), and print a
1122
+ ready fix message for copper-pilot --mode agent with --emit-fix-prompt.
1123
+ Expose validate(workspace?, profile?, gate?, until?, only?, effort?,
1124
+ no_cache?) on the MCP server with per-check progress and the fixed read-only
1125
+ reviewer policy. Add a Validate section to the review skill and plugin,
1126
+ docs/validate.md, and the CLI reference with the exit-code table.
1127
+ - Feat(validate): hosted agent reviewers with read-only broker,
1128
+ grounding and consensus. [AdityaNG, Claude Fable 5.1]
1129
+
1130
+ Add the reviewer adapter: each agent check runs CopperPilot in Ask mode
1131
+ against a read-only snapshot of the workspace through a Manual broker whose
1132
+ policy approves reads, scratch-folder writes and non-dangerous shell only.
1133
+ The snapshot is re-hashed after every check; any change outside scratch is
1134
+ an ERROR. Replies must end with a fenced json findings block (two repair
1135
+ turns, then ERROR); findings are grounded against the design index and
1136
+ ungrounded ones can never fail a check. per_part, per_sheet and per_netclass
1137
+ checks fan out in batches, repeat: N takes a majority consensus, and a
1138
+ non-retryable usage-limit block stops scheduling agent checks and exits 4.
1139
+ default.yaml gains the agent checks for S1-S8 and the CLI gains --effort,
1140
+ --concurrency and --repeat.
1141
+ - Feat(validate): engine, builtin checks, reports, and validate
1142
+ list|graph|run. [AdityaNG, Claude Fable 5.1]
1143
+
1144
+ Add the copper-pilot validate subcommand: a stage-gated graph of read-only
1145
+ checks loaded from a packaged default.yaml and extended by
1146
+ .copperpilot/validate.yaml. This slice ships the engine (config models and
1147
+ graph validation, design snapshot/hash/index, kicad-cli wrappers, dependency
1148
+ waves, stage/full/strict gating, result cache) with the deterministic builtin
1149
+ checks (intake.tools, intake.project, intake.intent, parts.bom_fields,
1150
+ sch.erc, pcb.parity, pcb.rules, pcb.drc, release.outputs, release.repo) and
1151
+ writes report.json, REPORT.md and next_actions.json under
1152
+ .copperpilot/validate/runs/<id>/ with a latest pointer.
1153
+ - Merge pull request #20 from CopperPilot/feat/acp-session-updates.
1154
+ [Aditya]
1155
+
1156
+ feat(acp): usage, plan, subagent, elicitation, and /effort session updates
1157
+ - Merge origin/main into feat/acp-session-updates. [AdityaNG, Claude
1158
+ Fable 5.1]
1159
+ - Merge pull request #19 from CopperPilot/feat/client-turn-durability.
1160
+ [Aditya]
1161
+
1162
+ feat: make hosted turns durable across transport drops
1163
+ - Fix(background): normalize CRLF shell output on Windows. [AdityaNG,
1164
+ Claude Fable 5.1]
1165
+ - Feat: make hosted turns durable across transport drops. [AdityaNG,
1166
+ Claude Fable 5.1]
1167
+
1168
+ Port the desktop client's chat-manager resilience into the shared graph
1169
+ node so every front-end (TUI, headless, MCP, ACP) benefits:
1170
+
1171
+ - Retry a dropped stream up to three times with 5/10/20 s backoff and a
1172
+ stitched "Resume where we left off" re-prompt carrying the partial
1173
+ transcript, so the hosted agent continues instead of restarting.
1174
+ - Classify failures like `_categorizeError`: drops, timeouts, 5xx and 429
1175
+ retry; 4xx, invalid/oversized requests, plan refusals and auth fail fast.
1176
+ - Capture the websocket close code and reason in the error message and log,
1177
+ including drops that happen while a tool result is being sent.
1178
+ - Checkpoint partial progress (text, tool calls, results) on a terminal
1179
+ failure or cancellation with a hidden interruption note, so a later
1180
+ manual "continue" has the prior work in context.
1181
+ - Surface retry progress as `copper.retry` events: ACP agent thoughts, TUI
1182
+ status/notification, headless yellow lines, MCP progress.
1183
+ - Honour the desktop foreground-to-background shell contract: commands
1184
+ outliving their timeout keep running, the turn continues, and their
1185
+ output is fed back in a continuation turn after the final frame.
1186
+ - Drop the 300 s idle-frame timeout; websocket keepalive still detects dead
1187
+ peers and long hosted reasoning no longer trips a client limit.
1188
+ - Fix the ACP cancel race where a server close after `session/cancel`
1189
+ surfaced as an error instead of `cancelled`.
1190
+ - Fix(acp): read slash commands from the first prompt block. [AdityaNG,
1191
+ Claude Fable 5.1]
1192
+
1193
+ T3 Code appends runtime context as a second text block, so /effort was
1194
+ reaching the hosted agent instead of being answered locally.
1195
+ - Fix(acp): elicit option questions, unwrap T3 prompts, bound question
1196
+ waits. [AdityaNG, Claude Fable 5.1]
1197
+
1198
+ T3 Code in Full access auto-selects the first option of a permission prompt,
1199
+ so clarifying questions with options now use form elicitation (enum) when the
1200
+ client supports it. /effort is recognised inside T3's <user_request> envelope.
1201
+ Questions nobody answers within 100 seconds are skipped with a note, because
1202
+ the hosted service drops a turn whose tool result takes longer than two minutes.
1203
+ - Feat(acp): usage, plan, subagent, elicitation, and /effort updates.
1204
+ [AdityaNG, Claude Fable 5.1]
1205
+
1206
+ Emit usage_update from hosted token counts so T3 Code's context meter works,
1207
+ project hosted todo_list events and .copperpilot/plans artifacts onto ACP plan
1208
+ entries, render Intelligence survey workers as think tool calls, collect
1209
+ free-text clarifications through ACP form elicitation when the client supports
1210
+ it, and advertise a locally handled /effort command.
1211
+
1212
+
1213
+ 0.1.9 (2026-10-16)
1214
+ ------------------
1215
+ - Release: version 0.1.9 🚀 [AdityaNG]
1216
+ - Merge pull request #18 from CopperPilot/feat/acp-server. [Aditya]
1217
+
1218
+ feat: add `copper-pilot acp` Agent Client Protocol server
1219
+ - Fix(acp): surface hosted turn failures in the JSON-RPC error message.
1220
+ [AdityaNG, Claude Fable 5.1]
1221
+
1222
+ T3 Code showed a bare "Internal error" for a prompt the hosted service
1223
+ had refused with "Upgrade to a paid plan to use Intelligence." because the
1224
+ explanation only lived in the error's `data`, which T3 does not display.
1225
+ Carry the hosted message in the error `message` (keeping the code), map a
1226
+ refused websocket handshake to auth_required when it is 401/403, log every
1227
+ failed turn to the diagnostics log, and never let an unexpected exception
1228
+ escape to the SDK's generic handler.
1229
+ - Fix(acp): accept `copper-pilot acp auth login` for clients that append
1230
+ login args. [AdityaNG, Claude Fable 5.1]
1231
+
1232
+ T3 Code runs an ACP terminal auth method by appending the method's args to
1233
+ the configured agent command, so the advertised `auth login` was spawned as
1234
+ `copper-pilot acp auth login`. The acp parser rejected the extra arguments
1235
+ with exit code 2 and T3 reported "The provider login command did not finish
1236
+ successfully." Normalize `acp auth ...` onto `auth ...` before parsing and
1237
+ document the alias.
1238
+ - Feat: add `copper-pilot acp` Agent Client Protocol server. [AdityaNG,
1239
+ Claude Fable 5.1]
1240
+
1241
+ Serve the hosted CopperPilot agent over ACP stdio so editors such as Zed
1242
+ can drive it with streaming messages, tool calls, permission prompts,
1243
+ session modes (ask/plan/agent), an effort config option, session/load
1244
+ resume of existing threads, and session/cancel.
1245
+
1246
+ - New copper_acp.py built directly on the agent-client-protocol SDK;
1247
+ approvals and clarifying questions map onto session/request_permission.
1248
+ - `acp` optional extra; the command prints an install hint without it.
1249
+ - CI license gate ignores agent-client-protocol (Apache-2.0 LICENSE file,
1250
+ no license metadata in the wheel).
1251
+ - Tests: tests/test_acp.py (100% coverage of copper_acp.py, including a
1252
+ real stdio JSON-RPC round trip), parser and entrypoint tests, and a
1253
+ release-gate check for the extra.
1254
+ - Docs: cli.md, harness.md (Zed setup), README.
1255
+
1256
+
1257
+ 0.1.8 (2026-10-14)
1258
+ ------------------
1259
+
1260
+ Fix
1261
+ ~~~
1262
+ - Annotate async context managers for ty 0.0.87. [AdityaNG]
1263
+
1264
+ CI resolves the unpinned ty dependency to 0.0.87, which rejects AsyncIterator returns on asynccontextmanager.
1265
+ - Upgrade the pinned Deep Agents runtime to 0.7.19. [AdityaNG]
1266
+
1267
+ Keep the exact runtime pin while picking up the filesystem and media-handling fixes from 0.7.14.
1268
+ - Align the CLI with hosted usage limits. [AdityaNG]
1269
+
1270
+ Keep blocked turns machine-readable, shrink oversized resumed chats to the desktop frame budget, and report the installed client version.
1271
+
1272
+ Other
1273
+ ~~~~~
1274
+ - Release: version 0.1.8 🚀 [AdityaNG]
1275
+ - Merge pull request #16 from CopperPilot/update/14_oct_2026. [Aditya]
1276
+
1277
+ Add Intelligence effort, hosted survey workers, and modal keyboard focus
1278
+ - Fix(tests/test_tui.py) [AdityaNG]
1279
+ - Feat(src/copper_pilot_cli/copper_status_events.py) [AdityaNG]
1280
+ - Merge pull request #3 from
1281
+ CopperPilot/dependabot/github_actions/softprops/action-gh-release-3.
1282
+ [Aditya]
1283
+
1284
+ build(deps): bump softprops/action-gh-release from 2 to 3
1285
+ - Build(deps): bump softprops/action-gh-release from 2 to 3.
1286
+ [dependabot[bot]]
1287
+
1288
+ Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
1289
+ - [Release notes](https://github.com/softprops/action-gh-release/releases)
1290
+ - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
1291
+ - [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)
1292
+
1293
+ ---
1294
+ updated-dependencies:
1295
+ - dependency-name: softprops/action-gh-release
1296
+ dependency-version: '3'
1297
+ dependency-type: direct:production
1298
+ update-type: version-update:semver-major
1299
+ ...
1300
+ - Merge pull request #4 from CopperPilot/dependabot/pip/websockets-
1301
+ gte-15-and-lt-18. [Aditya]
1302
+
1303
+ build(deps): update websockets requirement from <17,>=15 to >=15,<18
1304
+ - Build(deps): update websockets requirement from <17,>=15 to >=15,<18.
1305
+ [dependabot[bot]]
1306
+
1307
+ Updates the requirements on [websockets](https://github.com/python-websockets/websockets) to permit the latest version.
1308
+ - [Release notes](https://github.com/python-websockets/websockets/releases)
1309
+ - [Commits](https://github.com/python-websockets/websockets/compare/15.0...17.1)
1310
+
1311
+ ---
1312
+ updated-dependencies:
1313
+ - dependency-name: websockets
1314
+ dependency-version: '17.1'
1315
+ dependency-type: direct:production
1316
+ ...
1317
+ - Merge pull request #5 from CopperPilot/dependabot/pip/uuid-utils-
1318
+ gte-0.12-and-lt-2. [Aditya]
1319
+
1320
+ build(deps): update uuid-utils requirement from <1,>=0.12 to >=0.12,<2
1321
+ - Build(deps): update uuid-utils requirement from <1,>=0.12 to
1322
+ >=0.12,<2. [dependabot[bot]]
1323
+
1324
+ Updates the requirements on [uuid-utils](https://github.com/aminalaee/uuid-utils) to permit the latest version.
1325
+ - [Release notes](https://github.com/aminalaee/uuid-utils/releases)
1326
+ - [Commits](https://github.com/aminalaee/uuid-utils/compare/0.12.0...1.0.0)
1327
+
1328
+ ---
1329
+ updated-dependencies:
1330
+ - dependency-name: uuid-utils
1331
+ dependency-version: 1.0.0
1332
+ dependency-type: direct:production
1333
+ ...
1334
+ - Merge pull request #2 from
1335
+ CopperPilot/dependabot/github_actions/actions/setup-python-7. [Aditya]
1336
+
1337
+ build(deps): bump actions/setup-python from 5 to 7
1338
+ - Build(deps): bump actions/setup-python from 5 to 7. [dependabot[bot]]
1339
+
1340
+ Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 7.
1341
+ - [Release notes](https://github.com/actions/setup-python/releases)
1342
+ - [Commits](https://github.com/actions/setup-python/compare/v5...v7)
1343
+
1344
+ ---
1345
+ updated-dependencies:
1346
+ - dependency-name: actions/setup-python
1347
+ dependency-version: '7'
1348
+ dependency-type: direct:production
1349
+ update-type: version-update:semver-major
1350
+ ...
1351
+ - Merge pull request #13 from
1352
+ CopperPilot/update/deepagents_0_7_19_3_oct. [Aditya]
1353
+
1354
+ Upgrade the pinned Deep Agents runtime to 0.7.19
1355
+ - Merge pull request #1 from
1356
+ CopperPilot/dependabot/github_actions/actions/checkout-7. [Aditya]
1357
+
1358
+ build(deps): bump actions/checkout from 4 to 7
1359
+ - Build(deps): bump actions/checkout from 4 to 7. [dependabot[bot]]
1360
+
1361
+ Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.
1362
+ - [Release notes](https://github.com/actions/checkout/releases)
1363
+ - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
1364
+ - [Commits](https://github.com/actions/checkout/compare/v4...v7)
1365
+
1366
+ ---
1367
+ updated-dependencies:
1368
+ - dependency-name: actions/checkout
1369
+ dependency-version: '7'
1370
+ dependency-type: direct:production
1371
+ update-type: version-update:semver-major
1372
+ ...
1373
+ - Merge pull request #12 from
1374
+ CopperPilot/update/contract_alignment_3_oct. [Aditya]
1375
+
1376
+ Align the CLI with hosted usage limits
1377
+
1378
+
1379
+ 0.1.7 (2026-10-03)
1380
+ ------------------
1381
+ - Release: version 0.1.7 🚀 [AdityaNG]
1382
+ - Merge pull request #11 from
1383
+ CopperPilot/feat/python_versions_support_expansion. [Aditya]
1384
+
1385
+ Support Python 3.11 and future releases
1386
+ - Ci: probe Python 3.15 weekly instead of on pull requests. [AdityaNG]
1387
+
1388
+ Keep the upstream install failure visible without turning required pull request checks red.
1389
+ - Feat(py11) [AdityaNG]
1390
+ - Merge pull request #7 from CopperPilot/feat/example_002_cm5_camera.
1391
+ [Aditya]
1392
+
1393
+ feat(examples/002_cm5_camera): add 3D pose audit and generated carrier
1394
+ - Fix(examples/002_cm5_camera): render the README PCB as a dimetric 3D
1395
+ view. [AdityaNG, Cursor]
1396
+
1397
+ Use an orthogonal high-quality camera with a slight isometric tilt so the
1398
+ hero PNG shows connector height instead of a flat top-down shot.
1399
+ - Fix(examples/002_cm5_camera): skip library dirs relative to the
1400
+ workspace. [AdityaNG, Cursor]
1401
+
1402
+ Absolute path parts named tmp (Linux /tmp pytest roots) were skipping the
1403
+ entire haystack, so libraries_ready failed on Ubuntu CI.
1404
+ - Feat(examples/002_cm5_camera): add 3D pose audit and generated
1405
+ carrier. [AdityaNG, Cursor]
1406
+
1407
+ Lock connector 3D offsets, Module1 pad orientation, and the generated
1408
+ KiCad project so the example reproduces NANO-C assembly parity.
1409
+ - Feat(examples/002_cm5_camera/main.py): new example. [AdityaNG]
1410
+
1411
+
1412
+ 0.1.6 (2026-09-18)
1413
+ ------------------
1414
+ - Release: version 0.1.6 🚀 [AdityaNG]
1415
+ - Merge pull request #6 from CopperPilot/feat/plugins. [Aditya]
1416
+
1417
+ feat: add MCP conductor and Claude Code plugin
1418
+ - Clarify server restrictions in PR template. [Aditya]
1419
+
1420
+ Updated checklist item to clarify server restrictions.
1421
+ - Feat: add MCP conductor and Claude Code plugin. [AdityaNG, Cursor]
1422
+
1423
+ Let Claude Code, Cursor, and Codex delegate electronics work to the hosted agent via copper-pilot mcp, a portable review skill, and an in-repo plugin.
1424
+
1425
+
1426
+ 0.1.5 (2026-09-17)
1427
+ ------------------
1428
+ - Release: version 0.1.5 🚀 [AdityaNG]
1429
+ - Fix(README.md) [AdityaNG]
1430
+
1431
+
1432
+ 0.1.4 (2026-09-17)
1433
+ ------------------
1434
+ - Release: version 0.1.4 🚀 [AdityaNG]
1435
+ - Fix(tests/test_release_gates.py) [AdityaNG]
1436
+
1437
+
1438
+ 0.1.3 (2026-09-17)
1439
+ ------------------
1440
+ - Release: version 0.1.3 🚀 [AdityaNG]
1441
+ - Docs. [AdityaNG]
1442
+
1443
+
1444
+ 0.1.2 (2026-09-17)
1445
+ ------------------
1446
+ - Release: version 0.1.2 🚀 [AdityaNG]
1447
+ - Ci(pyproject.toml) [AdityaNG]
1448
+ - Fix(tests/test_tui.py) [AdityaNG]
1449
+
1450
+
1451
+ 0.1.1 (2026-09-17)
1452
+ ------------------
1453
+ - Release: version 0.1.1 🚀 [AdityaNG]
1454
+
1455
+
1456
+ 0.1.0 (2026-09-17)
1457
+ ------------------
1458
+ - Release: version 0.1.0 🚀 [AdityaNG]
1459
+ - Fix(tests/test_release_gates.py) [AdityaNG]
1460
+ - Test. [AdityaNG]
1461
+ - Docs. [AdityaNG]
1462
+ - Docs. [AdityaNG]
1463
+ - Example(examples/001_esp32/) [AdityaNG]
1464
+ - Makefile. [AdityaNG]
1465
+ - Ci. [AdityaNG]
1466
+ - Docs. [AdityaNG]
1467
+ - Refactor(name) [AdityaNG]
1468
+ - Init. [AdityaNG]
1469
+
1470
+