xtrm-tools 0.7.16 → 0.7.18

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 (264) hide show
  1. package/.xtrm/config/hooks.json +2 -0
  2. package/.xtrm/config/instructions/agents-top.md +2 -1
  3. package/.xtrm/registry.json +432 -707
  4. package/.xtrm/skills/default/creating-service-skills/scripts/bootstrap.py +82 -156
  5. package/.xtrm/skills/default/creating-service-skills/scripts/scaffolder.py +73 -121
  6. package/.xtrm/skills/default/hook-development/references/patterns.md +1 -1
  7. package/.xtrm/skills/default/last30days/scripts/test-v1-vs-v2.sh +2 -2
  8. package/.xtrm/skills/default/planning/SKILL.md +75 -29
  9. package/.xtrm/skills/default/releasing/SKILL.md +163 -57
  10. package/.xtrm/skills/default/security-pipeline/SKILL.md +192 -0
  11. package/.xtrm/skills/default/security-pipeline/scripts/security-bootstrap.sh +294 -0
  12. package/.xtrm/skills/default/security-pipeline/templates/.githooks/pre-push.template +39 -0
  13. package/.xtrm/skills/default/security-pipeline/templates/.github/workflows/gitleaks.yml +33 -0
  14. package/.xtrm/skills/default/security-pipeline/templates/.github/workflows/osv-scanner.yml +33 -0
  15. package/.xtrm/skills/default/security-pipeline/templates/.github/workflows/semgrep.yml +41 -0
  16. package/.xtrm/skills/default/security-pipeline/templates/.gitleaks.toml +44 -0
  17. package/.xtrm/skills/default/security-pipeline/templates/.pre-commit-config.yaml +67 -0
  18. package/.xtrm/skills/default/security-pipeline/templates/.semgrepignore +46 -0
  19. package/.xtrm/skills/default/security-pipeline/templates/scripts/security-scan.sh +57 -0
  20. package/.xtrm/skills/default/security-pipeline/templates/scripts/semgrep-diff.sh +68 -0
  21. package/.xtrm/skills/default/session-close-report/SKILL.md +167 -6
  22. package/.xtrm/skills/default/sync-docs/SKILL.md +1 -1
  23. package/.xtrm/skills/default/update-specialists/SKILL.md +204 -77
  24. package/.xtrm/skills/default/update-xt/SKILL.md +270 -4
  25. package/.xtrm/skills/default/updating-service-skills/scripts/drift_detector.py +22 -0
  26. package/.xtrm/skills/default/using-kpi/SKILL.md +47 -5
  27. package/.xtrm/skills/default/using-script-specialists/SKILL.md +7 -5
  28. package/.xtrm/skills/default/using-specialists/SKILL.md +13 -12
  29. package/.xtrm/skills/default/using-specialists-auto/SKILL.md +137 -0
  30. package/.xtrm/skills/default/using-specialists-v2/SKILL.md +15 -22
  31. package/.xtrm/skills/default/using-specialists-v3/SKILL.md +1074 -0
  32. package/.xtrm/skills/default/vaultctl/SKILL.md +2 -2
  33. package/CHANGELOG.md +91 -3
  34. package/cli/dist/index.cjs +12425 -3770
  35. package/cli/dist/index.cjs.map +1 -1
  36. package/cli/package.json +9 -3
  37. package/package.json +27 -7
  38. package/packages/pi-extensions/extensions/xtrm-ui/index.ts +76 -1
  39. package/packages/pi-extensions/package.json +1 -1
  40. package/.xtrm/config/pi/extensions/custom-footer/.pi/structured-returns/83051fe4-97da-4e2c-bdaa-343b32f4e714.combined.log +0 -7
  41. package/.xtrm/config/pi/extensions/custom-footer/.pi/structured-returns/83051fe4-97da-4e2c-bdaa-343b32f4e714.stderr.log +0 -0
  42. package/.xtrm/config/pi/extensions/custom-footer/.pi/structured-returns/83051fe4-97da-4e2c-bdaa-343b32f4e714.stdout.log +0 -7
  43. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/LICENSE +0 -22
  44. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/README.md +0 -29
  45. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.d.ts +0 -3
  46. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.d.ts.map +0 -1
  47. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.js +0 -2
  48. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/index.js.map +0 -1
  49. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.d.ts +0 -8
  50. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.d.ts.map +0 -1
  51. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.js +0 -27
  52. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chrome.js.map +0 -1
  53. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.d.ts +0 -11
  54. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.d.ts.map +0 -1
  55. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.js +0 -100
  56. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/crypto.js.map +0 -1
  57. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.d.ts +0 -25
  58. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.d.ts.map +0 -1
  59. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.js +0 -104
  60. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/linuxKeyring.js.map +0 -1
  61. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.d.ts +0 -10
  62. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.d.ts.map +0 -1
  63. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.js +0 -293
  64. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/shared.js.map +0 -1
  65. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.d.ts +0 -10
  66. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.d.ts.map +0 -1
  67. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.js +0 -26
  68. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqlite/windowsDpapi.js.map +0 -1
  69. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.d.ts +0 -7
  70. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.d.ts.map +0 -1
  71. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.js +0 -51
  72. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteLinux.js.map +0 -1
  73. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.d.ts +0 -7
  74. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.d.ts.map +0 -1
  75. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.js +0 -60
  76. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteMac.js.map +0 -1
  77. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.d.ts +0 -7
  78. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.d.ts.map +0 -1
  79. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.js +0 -38
  80. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromeSqliteWindows.js.map +0 -1
  81. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.d.ts +0 -5
  82. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.d.ts.map +0 -1
  83. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.js +0 -33
  84. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/linuxPaths.js.map +0 -1
  85. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.d.ts +0 -24
  86. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.d.ts.map +0 -1
  87. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.js +0 -30
  88. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/macosKeychain.js.map +0 -1
  89. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.d.ts +0 -11
  90. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.d.ts.map +0 -1
  91. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.js +0 -43
  92. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/paths.js.map +0 -1
  93. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.d.ts +0 -8
  94. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.d.ts.map +0 -1
  95. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.js +0 -41
  96. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsMasterKey.js.map +0 -1
  97. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.d.ts +0 -8
  98. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.d.ts.map +0 -1
  99. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.js +0 -53
  100. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/chromium/windowsPaths.js.map +0 -1
  101. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.d.ts +0 -8
  102. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.d.ts.map +0 -1
  103. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.js +0 -27
  104. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edge.js.map +0 -1
  105. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.d.ts +0 -7
  106. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.d.ts.map +0 -1
  107. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.js +0 -53
  108. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteLinux.js.map +0 -1
  109. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.d.ts +0 -8
  110. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.d.ts.map +0 -1
  111. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.js +0 -60
  112. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteMac.js.map +0 -1
  113. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.d.ts +0 -7
  114. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.d.ts.map +0 -1
  115. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.js +0 -38
  116. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/edgeSqliteWindows.js.map +0 -1
  117. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.d.ts +0 -6
  118. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.d.ts.map +0 -1
  119. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.js +0 -257
  120. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/firefoxSqlite.js.map +0 -1
  121. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.d.ts +0 -8
  122. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.d.ts.map +0 -1
  123. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.js +0 -71
  124. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/inline.js.map +0 -1
  125. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.d.ts +0 -6
  126. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.d.ts.map +0 -1
  127. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.js +0 -173
  128. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/providers/safariBinaryCookies.js.map +0 -1
  129. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.d.ts +0 -26
  130. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.d.ts.map +0 -1
  131. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.js +0 -195
  132. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/public.js.map +0 -1
  133. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.d.ts +0 -121
  134. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.d.ts.map +0 -1
  135. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.js +0 -2
  136. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/types.js.map +0 -1
  137. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.d.ts +0 -2
  138. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.d.ts.map +0 -1
  139. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.js +0 -18
  140. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/base64.js.map +0 -1
  141. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.d.ts +0 -8
  142. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.d.ts.map +0 -1
  143. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.js +0 -110
  144. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/exec.js.map +0 -1
  145. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.d.ts +0 -2
  146. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.d.ts.map +0 -1
  147. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.js +0 -32
  148. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/expire.js.map +0 -1
  149. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.d.ts +0 -2
  150. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.d.ts.map +0 -1
  151. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.js +0 -13
  152. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/fs.js.map +0 -1
  153. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.d.ts +0 -2
  154. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.d.ts.map +0 -1
  155. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.js +0 -7
  156. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/hostMatch.js.map +0 -1
  157. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.d.ts +0 -5
  158. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.d.ts.map +0 -1
  159. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.js +0 -58
  160. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/nodeSqlite.js.map +0 -1
  161. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.d.ts +0 -2
  162. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.d.ts.map +0 -1
  163. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.js +0 -27
  164. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/origins.js.map +0 -1
  165. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.d.ts +0 -2
  166. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.d.ts.map +0 -1
  167. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.js +0 -8
  168. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/dist/util/runtime.js.map +0 -1
  169. package/.xtrm/skills/default/last30days/scripts/lib/vendor/bird-search/node_modules/@steipete/sweet-cookie/package.json +0 -40
  170. package/.xtrm/skills/default/planning/evals/evals.json +0 -19
  171. package/.xtrm/skills/default/quality-gates/evals/evals.json +0 -181
  172. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/FINAL-EVAL-SUMMARY.md +0 -75
  173. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/edge-case-auto-fix-verification/with_skill/outputs/response.md +0 -59
  174. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/edge-case-mixed-language-project/with_skill/outputs/response.md +0 -60
  175. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/eval-summary.md +0 -105
  176. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/partial-install-python-only/with_skill/outputs/response.md +0 -93
  177. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/python-refactor-request/with_skill/outputs/response.md +0 -104
  178. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/quality-gate-error-fix/with_skill/outputs/response.md +0 -74
  179. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/should-not-trigger-general-chat/with_skill/outputs/response.md +0 -18
  180. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/should-not-trigger-math-question/with_skill/outputs/response.md +0 -18
  181. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/should-not-trigger-unrelated-coding/with_skill/outputs/response.md +0 -56
  182. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/tdd-guard-blocking-confusion/with_skill/outputs/response.md +0 -67
  183. package/.xtrm/skills/default/quality-gates/workspace/iteration-1/typescript-feature-with-tests/with_skill/outputs/response.md +0 -97
  184. package/.xtrm/skills/default/sync-docs/evals/evals.json +0 -89
  185. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/benchmark.json +0 -293
  186. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/benchmark.md +0 -13
  187. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/eval_metadata.json +0 -27
  188. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/outputs/result.md +0 -210
  189. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/grading.json +0 -28
  190. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/timing.json +0 -1
  191. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/outputs/result.md +0 -101
  192. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/grading.json +0 -28
  193. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/timing.json +0 -5
  194. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/timing.json +0 -5
  195. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/eval_metadata.json +0 -27
  196. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/outputs/result.md +0 -198
  197. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/grading.json +0 -28
  198. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/timing.json +0 -1
  199. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/outputs/result.md +0 -94
  200. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/grading.json +0 -28
  201. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/timing.json +0 -1
  202. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/eval_metadata.json +0 -27
  203. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/outputs/result.md +0 -237
  204. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/grading.json +0 -28
  205. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/timing.json +0 -1
  206. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/outputs/result.md +0 -134
  207. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/grading.json +0 -28
  208. package/.xtrm/skills/default/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/timing.json +0 -1
  209. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/benchmark.json +0 -297
  210. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/benchmark.md +0 -13
  211. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/eval_metadata.json +0 -27
  212. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/outputs/result.md +0 -137
  213. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/grading.json +0 -92
  214. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/timing.json +0 -1
  215. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/outputs/result.md +0 -134
  216. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/grading.json +0 -86
  217. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/timing.json +0 -1
  218. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/eval_metadata.json +0 -27
  219. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/outputs/result.md +0 -193
  220. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/grading.json +0 -72
  221. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/timing.json +0 -1
  222. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/outputs/result.md +0 -211
  223. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/grading.json +0 -91
  224. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/timing.json +0 -5
  225. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/eval_metadata.json +0 -27
  226. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/outputs/result.md +0 -182
  227. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/grading.json +0 -95
  228. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/timing.json +0 -1
  229. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/outputs/result.md +0 -222
  230. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/grading.json +0 -88
  231. package/.xtrm/skills/default/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/timing.json +0 -5
  232. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/benchmark.json +0 -298
  233. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/benchmark.md +0 -13
  234. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/eval_metadata.json +0 -27
  235. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/outputs/result.md +0 -125
  236. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/grading.json +0 -97
  237. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/timing.json +0 -5
  238. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/outputs/result.md +0 -144
  239. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/grading.json +0 -78
  240. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/timing.json +0 -5
  241. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/eval_metadata.json +0 -27
  242. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/outputs/result.md +0 -104
  243. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/grading.json +0 -91
  244. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/timing.json +0 -5
  245. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/outputs/result.md +0 -79
  246. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/grading.json +0 -82
  247. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/timing.json +0 -5
  248. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/eval_metadata.json +0 -27
  249. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase1_context.json +0 -302
  250. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase2_drift.txt +0 -33
  251. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase3_analysis.json +0 -114
  252. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase4_fix.txt +0 -118
  253. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase5_validate.txt +0 -38
  254. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/result.md +0 -158
  255. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/grading.json +0 -95
  256. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/timing.json +0 -5
  257. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/outputs/result.md +0 -71
  258. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/grading.json +0 -90
  259. package/.xtrm/skills/default/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/timing.json +0 -5
  260. package/.xtrm/skills/default/test-planning/evals/evals.json +0 -23
  261. package/.xtrm/skills/default/using-specialists/SKILL.safe.md +0 -1082
  262. package/.xtrm/skills/default/using-specialists/SKILL.ultra.md +0 -1082
  263. package/.xtrm/skills/default/using-specialists/evals/evals.json +0 -68
  264. package/packages/pi-extensions/.serena/project.yml +0 -130
@@ -28,7 +28,8 @@ This is what a correctly installed project looks like. Check each item.
28
28
  | `.xtrm/skills/active/` | Flat directory of symlinks to `../default/<skill>` |
29
29
  | `active/pi/` subdirectory | Must NOT exist (stale — old runtime split) |
30
30
  | `active/claude/` subdirectory | Must NOT exist (stale — old runtime split) |
31
- | `.pi/settings.json` `.skills` array | Must include `"../.xtrm/skills/active"` |
31
+ | `.pi/settings.json` `.skills` array | Must include `"../.xtrm/skills/active"` (project-local, wins) |
32
+ | `.pi/settings.json` `.skills` array | Must include `"~/.xtrm/skills/default"` (user-level fallback — xtrm-4h6u) |
32
33
  | `.pi/settings.json` `.skills` array | Must NOT include `"../.xtrm/skills/active/pi"` (old path) |
33
34
 
34
35
  ### Hooks wiring
@@ -65,10 +66,10 @@ readlink .claude/skills
65
66
  ls .xtrm/skills/active/pi 2>/dev/null && echo "STALE: active/pi exists"
66
67
  ls .xtrm/skills/active/claude 2>/dev/null && echo "STALE: active/claude exists"
67
68
 
68
- # 5. Pi settings skills entry
69
+ # 5. Pi settings skills entries (both must be present since xtrm-4h6u)
69
70
  node -e "const s=require('./.pi/settings.json'); console.log(s.skills)" 2>/dev/null
70
- # Expected to include: ../.xtrm/skills/active
71
- # Stale if includes: ../.xtrm/skills/active/pi
71
+ # Expected to include BOTH: ../.xtrm/skills/active AND ~/.xtrm/skills/default
72
+ # Stale if only first entry present, or if includes: ../.xtrm/skills/active/pi
72
73
 
73
74
  # 6. Active view integrity (all entries must be valid symlinks)
74
75
  for f in .xtrm/skills/active/*; do [ -L "$f" ] || echo "NOT A SYMLINK: $f"; done
@@ -167,6 +168,16 @@ cd cli && npm run build
167
168
  xt init -y # now runs with updated code
168
169
  ```
169
170
 
171
+ **Worktree caveat**: `npm run build` from inside `.xtrm/worktrees/<name>/cli/` is blocked by a guard script — building from a worktree contaminates dist with worktree-specific absolute paths. If you're working in a worktree, build from a detached worktree outside `.xtrm/`:
172
+
173
+ ```bash
174
+ git worktree add --detach /tmp/xt-build HEAD
175
+ cd /tmp/xt-build/cli && npm ci && npm run build
176
+ cp dist/index.cjs <worktree-root>/cli/dist/index.cjs
177
+ cp dist/index.cjs.map <worktree-root>/cli/dist/index.cjs.map
178
+ git worktree remove /tmp/xt-build --force
179
+ ```
180
+
170
181
  ## Verification
171
182
 
172
183
  After all fixes, confirm canonical state is restored:
@@ -198,6 +209,261 @@ If `xt status` still shows drift after targeted fixes, run the full sync:
198
209
  xt init
199
210
  ```
200
211
 
212
+ ## Multi-Repo Sweep (Fleet Update)
213
+
214
+ For updating **many repos at once** after an xtrm-tools upgrade — much lighter than
215
+ running `xt init -y` per repo. The right pattern when you've just rebuilt xtrm-tools
216
+ locally or pulled a new tag.
217
+
218
+ ### Dry-run discovery first
219
+
220
+ ```bash
221
+ xt update --root ~/dev # walk the tree
222
+ xt update --root ~/projects/mercury # walk another tree
223
+ ```
224
+
225
+ Output classifies each discovered repo by `.xtrm/` state:
226
+
227
+ | Status | Meaning | Action |
228
+ |--------|---------|--------|
229
+ | `refreshed` | `.xtrm/registry.json` present; drift vs current package detected | `--apply` will reinstall managed assets |
230
+ | `already-current` | `.xtrm/registry.json` present; no drift | no action |
231
+ | `incomplete` | `.xtrm/` directory exists but `.xtrm/registry.json` is missing | `xt init -y` now seeds registry.json automatically (xtrm-ya2i, xtrm-tools ≥ 0.7.18). Older `.xtrm/` dirs created before that fix still need the recipe below. |
232
+ | `failed` | Hard error during drift check or install | inspect reason — common: PACK metadata drift, missing source files, fs-extra refusing to copy onto a symlink |
233
+
234
+ Transient worktree paths under `.worktrees/` (specialists) or `.xtrm/worktrees/`
235
+ (`xt claude` / `xt pi`) are **skipped** automatically — they're not real repos to
236
+ refresh.
237
+
238
+ ### Apply
239
+
240
+ ```bash
241
+ xt update --apply --root ~/dev
242
+ xt update --apply --root ~/projects/mercury
243
+ ```
244
+
245
+ What `--apply` does for each managed repo:
246
+ - Runs the install flow with `force=true` — refreshes `.xtrm/config`, `.xtrm/hooks`, `.xtrm/skills/default` (mirror), `.pi/settings.json`, `.mcp.json`.
247
+ - Writes `dolt.shared-server: true` into `.beads/config.yaml` if not already set (so the worktree's bd routes to the shared dolt server instead of spawning per-worktree subprocesses).
248
+ - Globally installs any missing xt-managed Pi packages.
249
+ - Does NOT touch `incomplete` repos (deliberate — auto-fix would be destructive).
250
+
251
+ ### Bootstrapping `incomplete` repos
252
+
253
+ Two scenarios:
254
+
255
+ **A. The repo legitimately needs full xtrm management:**
256
+
257
+ ```bash
258
+ cd <repo>
259
+ xt init -y # scaffolds .xtrm/{config,hooks,skills} AND seeds registry.json
260
+ xt update --apply --repo . # bring everything in sync (registry-driven)
261
+ ```
262
+
263
+ `xt init -y` now snapshots `.xtrm/registry.json` from the installed xtrm-tools package automatically (xtrm-ya2i). The previous manual `cp /path/to/xtrm-tools/.xtrm/registry.json .xtrm/` step is no longer needed on xtrm-tools ≥ 0.7.18. If you're on an older version (or the registry is missing for some other reason), fall back to:
264
+
265
+ ```bash
266
+ cp "$(npm root -g)/xtrm-tools/.xtrm/registry.json" .xtrm/
267
+ ```
268
+
269
+ **B. The repo is intentionally not xtrm-managed.** Leave the `.xtrm/` partial dir
270
+ alone; `incomplete` is just a status row, not an error. If you want it to stop
271
+ appearing, remove the orphaned `.xtrm/` directory.
272
+
273
+ ### When a repo fails
274
+
275
+ Common failure modes and fixes:
276
+
277
+ | Error | Cause | Fix |
278
+ |-------|-------|-----|
279
+ | `Source and destination must not be the same` | `npm link`'d xtrm-tools + repo has symlinked `.xtrm/skills/default → xtrm-tools` (link chain collapses to same canonical path) | Functionally fine — repo is already in sync via the live symlinks, not a real failure. If you want to **fully decouple** the project from the dev tree, follow the migration recipe below. |
280
+ | `PACK_METADATA_MISMATCH: metadata-only: X, filesystem-only: Y` | A user-skill-pack (`.xtrm/skills/user/packs/<name>/PACK.json`) lists a skill that has been renamed on disk | Edit `PACK.json` so the listed skill names match the directory names; re-run. |
281
+ | `Cannot read properties of null (reading 'dolt')` | Repo's `.beads/config.yaml` is comments-only (fresh `bd init` default); pre-`xtrm-16ec` xtrm crashes parsing it | Upgrade xtrm-tools to ≥ 0.7.18; the parse result is coerced to `{}` defensively now. |
282
+
283
+ ## Migrating a dev-linked project to a real consumer install
284
+
285
+ A project ends up with `.xtrm/skills/default` (or another `.xtrm/` asset) as a **symlink** back to the dev tree when:
286
+ - xtrm-tools was `npm link`-ed globally (`/home/<user>/.nvm/.../node_modules/xtrm-tools` → `/home/<user>/dev/xtrm-tools/`), AND
287
+ - the project's `.xtrm/skills/default` was manually replaced with a symlink to the npm-global path (common dev-loop shortcut so skill edits propagate instantly).
288
+
289
+ `installFromRegistry`'s `scaffoldSkillsDefaultFromPackage` has an intentional branch (`registry-scaffold.ts:104`): *"if target is a symlink whose realpath equals the package realpath → noop"*. This **preserves the dev symlink** on every `xt update`. The arrangement is functional but the project is invisibly coupled to whatever lives in the dev tree (or whatever the global npm path points to).
290
+
291
+ ### When to migrate
292
+
293
+ - Before publishing a consumer-facing release of the dependent project.
294
+ - Before handing the project to another developer / machine.
295
+ - When you want `xt update --apply` to actually *write files into the project* rather than no-op.
296
+
297
+ ### Detection
298
+
299
+ ```bash
300
+ # Is .xtrm/skills/default a symlink, and where does it point?
301
+ readlink <repo>/.xtrm/skills/default
302
+ # If empty / not-a-symlink: nothing to migrate.
303
+ # If points anywhere outside <repo>/: needs migration.
304
+ ```
305
+
306
+ ### Recipe
307
+
308
+ ```bash
309
+ cd <repo>
310
+
311
+ # 1. Remove the symlink (does NOT touch the real files in the dev tree).
312
+ rm .xtrm/skills/default
313
+
314
+ # 2. Re-run init — copies real files from the installed xtrm-tools package
315
+ # into .xtrm/skills/default/ AND seeds .xtrm/registry.json (xtrm-ya2i).
316
+ xt init -y
317
+
318
+ # 3. If the symlink was committed (git ls-files showed it as mode 120000),
319
+ # flip the tracked entry to a real directory:
320
+ git rm --cached .xtrm/skills/default 2>/dev/null # ok if it was untracked
321
+ git add .xtrm/skills/default
322
+ git commit -m "chore: replace dev symlink with real xtrm skills payload"
323
+
324
+ # 4. Optional sanity: confirm no more symlinks point outside the repo.
325
+ find .xtrm -type l -lname '/*' -o -type l ! -lname '../*' -a ! -lname './*'
326
+ # Empty output means clean.
327
+ ```
328
+
329
+ ### What `npm install -g xtrm-tools` alone does
330
+
331
+ Replacing the `npm link` with a real npm install (`npm install -g xtrm-tools`) breaks the dev-tree coupling — the global path becomes real files at the published version — **but it does not remove the project's symlink.** The symlink still points at the global npm path, which now resolves to immutable published files. The project keeps working but stays pinned to the npm-installed version forever, and `.xtrm/skills/default` remains a symlink on disk.
332
+
333
+ To get true isolation (real files inside `<repo>/.xtrm/skills/default/`), the recipe above is still required.
334
+
335
+ ## Worktree hygiene: `.beads/` and `core.hooksPath`
336
+
337
+ Modern bd 1.0.3 stores `core.hooksPath` as an **absolute parent path** at `bd init`
338
+ time (e.g. `$HOME/repo/.beads/hooks`), so worktrees inherit parent hooks via
339
+ shared git config — no on-disk `.beads/` is needed inside a worktree. Since
340
+ `xtrm-cbjo` (xtrm-tools commit `937b151`) and `unitAI-yvqmf` (specialists commit
341
+ `986bc8e4`), `xt claude` / `xt pi` / `sp run` worktrees do **not** create a
342
+ `.beads/` symlink; they `rm -rf <worktree>/.beads` and `git update-index
343
+ --skip-worktree --` on tracked `.beads/*` paths. This eliminates the
344
+ squash-merge `.beads`-wipe hazard documented in projects/infra PR #39.
345
+
346
+ ### Audit your `core.hooksPath` once (xtrm-2s44)
347
+
348
+ If your bd was installed before 1.0.3, `core.hooksPath` may be the relative
349
+ string `.beads/hooks`, which would resolve against a worktree's cwd — i.e.,
350
+ the (now-missing) worktree-local `.beads/hooks/`. To survey:
351
+
352
+ ```bash
353
+ for r in ~/dev/*/ ~/projects/*/*/; do
354
+ [ -d "$r/.git" ] && [ -d "$r/.beads" ] || continue
355
+ hp=$(git -C "$r" config core.hooksPath 2>/dev/null || echo "<unset>")
356
+ case "$hp" in
357
+ /*) cat="ABSOLUTE" ;;
358
+ "<unset>") cat="UNSET" ;;
359
+ .beads/hooks) cat="RELATIVE-BD <- needs fix" ;;
360
+ *) cat="OTHER (project .githooks chain — leave alone)" ;;
361
+ esac
362
+ printf "%-50s %s\n" "${r#$HOME/} $cat" "$hp"
363
+ done
364
+ ```
365
+
366
+ Classification:
367
+ - `ABSOLUTE` — correct, no action.
368
+ - `RELATIVE-BD` (literal `.beads/hooks` or `./.beads/hooks`) — rewrite once:
369
+ ```bash
370
+ git -C <repo> config core.hooksPath "$(realpath <repo>/.beads/hooks)"
371
+ ```
372
+ - `OTHER` like `.githooks` — project-specific hook chain, leave alone. bd in
373
+ these repos works via direct invocation (not git hooks), so worktree hygiene
374
+ is unaffected.
375
+ - `UNSET` — no hooks wired anywhere; same outcome as `OTHER`.
376
+
377
+ Survey across `~/dev` + `~/projects/mercury` on 2026-05-12 returned **0 repos
378
+ needing the fix**. The safety net in `launchWorktreeSession` /
379
+ `provisionWorktree` (`normalizeParentHooksPath`) auto-rewrites on next worktree
380
+ creation if a relative `.beads/hooks` ever does appear, so the survey is mostly
381
+ defensive.
382
+
383
+ ### Worktree-internal artifact inventory (xtrm-x80f)
384
+
385
+ A worktree is a partial clone with extras: bd metadata, npm caches, runtime
386
+ state, per-worktree settings. None of these belong on a chain branch — but
387
+ the moment any of them get staged via `git add -A` or a checkpoint commit,
388
+ they can ride a PR into `main`. The matrix below documents what is protected
389
+ by which mechanism. Audit it whenever you add a new per-worktree artifact.
390
+
391
+ | Artifact | Source | Mechanism in a worktree | Status |
392
+ |----------|--------|-------------------------|--------|
393
+ | `.beads/*` | bd tracked dir | rm + `skip-worktree` (xtrm-cbjo) | ✅ |
394
+ | `.beads-credential-key`, `.beads/dolt-monitor.pid`, `.beads/dolt-server.activity` | bd runtime | gitignored at parent | ✅ |
395
+ | `.pi/npm/` | npm cache | gitignored + symlink to parent | ✅ |
396
+ | `.pi/extensions/` | pi runtime | gitignored under `.xtrm/extensions/**/.pi/` | ✅ |
397
+ | `.specialists/default` | (xtrm-tools: untracked) | symlink to parent in worktree | ✅ |
398
+ | `.specialists/user` | tracked (.json overrides) | symlink to parent in worktree | ⚠️ merge-hazard candidate, tracked at follow-up bead |
399
+ | `.specialists/{jobs,ready,trace.jsonl,db/*}` | runtime state | gitignored at parent | ✅ |
400
+ | `.claude/skills` | install symlink | gitignored | ✅ |
401
+ | `.claude/settings.local.json` | per-worktree write (`launchWorktreeSession`) | gitignored (user-global + project) | ✅ |
402
+ | `.claude/worktrees/`, `.claude/tdd-guard/data/` | runtime | gitignored | ✅ |
403
+ | `.xtrm/worktrees/`, `.xtrm/skills/active/`, `.xtrm/session-meta.json`, `.xtrm/statusline-claim`, `.xtrm/debug.db` | runtime | gitignored | ✅ |
404
+ | `AGENTS.md`, `CLAUDE.md` | tracked | gitnexus stat-counter scrubbed (xtrm-c6sf), build-gate prevents reintroduction | ✅ |
405
+ | `pnpm-workspace.yaml`, `cli/pnpm-workspace.yaml` | generated by pnpm in an npm-workspaces repo when specialist tooling shells out to pnpm | gitignored (xtrm-ombq) | ✅ |
406
+ | `.gitnexus/` | runtime | gitignored | ✅ |
407
+ | `.dolt/`, `*.db` | runtime | gitignored | ✅ |
408
+
409
+ The remaining ⚠️ is `.specialists/user/*.json`: the symlink swap in
410
+ `ensureWorktreeSpecialists` has the same shape as the pre-fix `.beads`
411
+ problem — a chain-branch checkpoint could capture the dir→symlink delta and
412
+ squash-merge would wipe the parent's `.specialists/user/`. Lower urgency
413
+ than `.beads` (smaller blast radius, files are intentional overrides) but
414
+ worth resolving with the same skip-worktree pattern when convenient.
415
+
416
+ The defense-in-depth pre-push guard in `xt end`
417
+ (`findBeadsSymlinkIntroductions`) currently only checks `.beads/*`. Extend
418
+ to `.specialists/*` if/when the symlink swap there becomes the next chain
419
+ of work.
420
+
421
+ ## Pre-Release Validation Methodology
422
+
423
+ Before publishing a new xtrm-tools version, validate the operator-facing CLI locally
424
+ against every consumer repo. This is the procedure that surfaced two release-blockers
425
+ in 2026-05-12 alone (`xtrm-16ec` yaml-null crash, `xtrm-ny61` worktree over-discovery).
426
+
427
+ ### Procedure
428
+
429
+ ```bash
430
+ # 1. Build dist from the local checkout
431
+ cd /path/to/xtrm-tools && npm run build --workspace cli
432
+
433
+ # 2. Link globally so `xt` runs local source
434
+ npm link
435
+
436
+ # 3. Sweep across all consumer trees (dry-run first)
437
+ xt update --root ~/dev
438
+ xt update --root ~/projects/mercury
439
+
440
+ # 4. Identify failed/incomplete rows. Fix any real bugs in xtrm-tools FIRST,
441
+ # then re-build + re-link + re-sweep.
442
+
443
+ # 5. Once dry-run is clean, apply across the fleet:
444
+ xt update --apply --root ~/dev
445
+ xt update --apply --root ~/projects/mercury
446
+
447
+ # 6. Cut the public release only after the local apply succeeds end-to-end.
448
+ ```
449
+
450
+ ### Why this beats publishing first and patching later
451
+
452
+ - A published `0.7.X` that crashes on a default-config consumer repo wastes a
453
+ version number — users see "upgrade and immediately break" and lose trust.
454
+ - Bugs that only manifest on real consumer state (comments-only YAML, transient
455
+ worktrees, drifted PACK metadata) are invisible from xtrm-tools' own test
456
+ suite — only a real sweep catches them.
457
+ - `npm link` flips between local-source-globally and published-version-globally
458
+ in seconds (`npm unlink` reverts), so the validation cost is minimal.
459
+
460
+ ### Watch-fors during the sweep
461
+
462
+ - **Pi packages shown as `missing` when `npm ls -g` confirms them installed** —
463
+ detection bug, filed at `xtrm-ntf8`. Not a real problem; packages work.
464
+ - **xtrm-tools itself appearing as `failed` with "Source and destination..."** —
465
+ expected when xtrm-tools is npm-linked into itself; not a release blocker.
466
+
201
467
  ## Reporting to the user
202
468
 
203
469
  After completing detection + remediation + verification, give the user a concise
@@ -28,6 +28,7 @@ from bootstrap import ( # noqa: E402
28
28
  RootResolutionError,
29
29
  find_service_for_path,
30
30
  get_project_root,
31
+ get_registry_path,
31
32
  get_service,
32
33
  load_registry,
33
34
  save_registry,
@@ -110,6 +111,22 @@ def check_drift_from_hook_stdin() -> None:
110
111
  sys.exit(0)
111
112
 
112
113
 
114
+ def _print_missing_registry_hint(project_root: str | None = None) -> None:
115
+ if project_root is None:
116
+ try:
117
+ project_root = get_project_root()
118
+ except RootResolutionError:
119
+ project_root = "."
120
+
121
+ root = Path(project_root)
122
+ expected = (
123
+ f"Registry not found. Expected one of: {root / 'service-registry.json'}, "
124
+ f"{root / '.claude/skills/service-registry.json'}, "
125
+ f"{root / '.xtrm/skills/user/packs/*/service-registry.json'}"
126
+ )
127
+ print(expected, file=sys.stderr)
128
+
129
+
113
130
  def update_sync_time(service_id: str, project_root: str | None = None) -> bool:
114
131
  """Update last_sync timestamp for a service in the registry."""
115
132
  try:
@@ -140,6 +157,11 @@ def scan_drift(project_root: str | None = None) -> list[dict]:
140
157
  return []
141
158
 
142
159
  root = Path(project_root)
160
+ registry_path = get_registry_path(project_root)
161
+ if not registry_path.exists():
162
+ _print_missing_registry_hint(project_root)
163
+ return []
164
+
143
165
  registry = load_registry(project_root)
144
166
  drifted: list[dict] = []
145
167
 
@@ -179,14 +179,56 @@ for s, t, a in rows:
179
179
  '
180
180
  ```
181
181
 
182
- Component kinds: `system_prompt`, `mandatory_rule` (one event entry per attached rule), `skill` (path reference, ~10 tokens — bodies are loaded on demand, not eagerly), `task_template`, `bead_context`, `memory`.
182
+ Component kinds: `system_prompt`, `mandatory_rule` (one event entry per attached rule), `skill` (path/description label onlyfull bodies are eagerly injected at runtime but NOT counted here), `task_template`, `bead_context`, `memory`.
183
183
 
184
- Optimization signals:
185
- - `mandatory_rule` total dominates: audit wrapper inflation by comparing `bytes` per rule in the event vs `wc -c config/mandatory-rules/<id>.md`. Mismatch >5x means a wrapper or richer source is adding hidden cost — investigate `formatMandatoryRulesBlock` and `parseMandatoryRulesFrontmatter`.
186
- - `skill` total small (always): skills are reference-only at startup; inlining skill bodies into rules saves nothing.
187
- - `bead_context` huge: the bead description is bloated orchestrator should write more concise contracts.
184
+ **Important:** `skill` entries in `payload_breakdown` show only the path/description label (~10-40 tokens). The full skill body is forcefully injected via `skills.paths` on every run and IS billed as input tokens. To measure the real eager-skill cost, see Recipe 8.
185
+
186
+ Optimization signals (from breakdown alone):
187
+ - `mandatory_rule` total dominates: audit wrapper inflation by comparing `bytes` per rule in the event vs `wc -c config/mandatory-rules/<id>.md`. Mismatch >5x means a wrapper or richer source is adding hidden cost.
188
+ - `bead_context` huge: bead description is bloated — orchestrator should write more concise contracts.
188
189
  - `memory` huge: stale or noisy memories — run `bd memories` cleanup or consolidation.
189
190
 
191
+ ## Recipe 8 — eager skill-body cost per specialist
192
+
193
+ `skills.paths` are eagerly injected on every run; the bodies appear in the API-billed prompt but the `payload_breakdown` event records only the path label. To derive the real eager-skill cost:
194
+
195
+ ```
196
+ eager_skill_cost ≈ first_turn_input_tokens − sum(payload_breakdown non-skill components)
197
+ − constant per-specialist framing/tool-defs overhead
198
+ ```
199
+
200
+ Two-step audit:
201
+
202
+ ```bash
203
+ # Step 1: real first-turn input tokens per specialist (truth)
204
+ DB=.specialists/db/observability.db
205
+ sqlite3 "$DB" "
206
+ SELECT specialist, AVG(json_extract(token_trajectory_json, '\$[0].token_usage.input_tokens')) AS avg_first_in, COUNT(*) AS n
207
+ FROM specialist_job_metrics
208
+ WHERE token_trajectory_json IS NOT NULL AND status='done'
209
+ GROUP BY specialist ORDER BY avg_first_in DESC"
210
+
211
+ # Step 2: per-specialist measured non-skill components (post-kdl4n)
212
+ sqlite3 "$DB" "SELECT specialist, event_json FROM specialist_events WHERE type='payload_breakdown' GROUP BY specialist ORDER BY t DESC" \
213
+ | python3 -c '
214
+ import json, sys
215
+ for line in sys.stdin:
216
+ if "|" not in line: continue
217
+ spec, js = line.split("|", 1)
218
+ d = json.loads(js)
219
+ non_skill = sum(c["tokens"] for c in d["payload_breakdown"]["components"] if c["kind"] != "skill")
220
+ print(f"{spec:<22}{non_skill:>10}")
221
+ '
222
+ ```
223
+
224
+ Then `delta = first_in − non_skill_total`. The framing/tool-defs constant is roughly the same across specialists with the same model — you can estimate it by running a specialist with NO `skills.paths` attached as a baseline.
225
+
226
+ Per-skill body weight: `wc -c <skill-path>/SKILL.md` divided by 4 (cl100k_base approximation). High-frequency, large-body skills are the inlining candidates; low-frequency or small ones stay attached.
227
+
228
+ Optimization signals (skills):
229
+ - `delta` >> sum of attached skill body bytes/4: framing/tool defs are the bulk — leave skills alone.
230
+ - `delta` ≈ sum of skill body weights: skills dominate eager cost — inline frequently-used hot guidance into `system_prompt`, keep rare deep references as skills, consider splitting big mixed skills.
231
+
190
232
  ## References
191
233
 
192
234
  - `docs/observability-metrics.md`
@@ -9,7 +9,9 @@ description: >
9
9
  output immediately, or when the work is a single LLM call with structured
10
10
  input/output. Do NOT use for tracked agent work — that belongs to
11
11
  `using-specialists-v2`.
12
- version: 1.0
12
+ version: 1.1.0
13
+ updated: 2026-05-06
14
+ synced_at: a0e54d0c
13
15
  ---
14
16
 
15
17
  # Script-Class Specialists
@@ -54,7 +56,7 @@ A spec is rejected at request time (`specialist_load_error`) if any of:
54
56
  - `execution.interactive` is `true`
55
57
  - `execution.requires_worktree` is `true`
56
58
  - `execution.permission_required` is anything other than `READ_ONLY`
57
- - `skills.scripts` is non-empty
59
+ - `skills.scripts` is non-empty (always rejected; no `--allow-local-scripts` bypass)
58
60
  - `prompt.task_template` is missing
59
61
  - a referenced `$var` in the chosen template is not supplied (`template_variable_missing`)
60
62
 
@@ -101,9 +103,9 @@ sp script <specialist-name> \
101
103
  Behaviour:
102
104
 
103
105
  - Loads the spec via `SpecialistLoader` (same loader as `sp run`).
104
- - Renders `prompt.task_template` (or named template) with `--vars`.
105
- - Spawns `pi --mode json --no-session --no-extensions --no-tools` with the
106
- resolved model.
106
+ - Renders `prompt.task_template` (or named template) with `--vars`, then feeds the rendered prompt via stdin.
107
+ - `--db-path /path/to/observability.db` is an exact SQLite file path; omit it to use the project default `.specialists/db/observability.db`.
108
+ - Spawns `pi` in JSON mode with no session, no extensions, no tools, and offline; forwards the resolved model, optional `--thinking`, and `--system-prompt` when `prompt.system` is set (full override, not append).
107
109
  - Returns the final assistant text on stdout. With `--json`, returns the full
108
110
  `ScriptGenerateResult` envelope.
109
111
  - Writes one row to `.specialists/db/observability.db` (same writer as `sp run`).
@@ -119,13 +119,13 @@ specialists status --job <job-id> # single-job detail view (legacy
119
119
  # Epic lifecycle (canonical publication path)
120
120
  specialists epic list [--unresolved] # list epics with lifecycle state
121
121
  specialists epic status <epic-id> # show chains, blockers, readiness
122
- specialists epic sync <epic-id> [--apply] # reconcile DB vs live state (dry-run default)
123
- specialists epic resolve <epic-id> # transition open -> resolving
122
+ specialists epic sync <epic-id> [--apply] # recompute derived readiness; repair drift
124
123
  specialists epic abandon <epic-id> --reason <text> [--force] # terminal transition for stuck epics
125
- specialists epic merge <epic-id> [--pr] # publish all epic-owned chains
124
+ specialists epic merge <epic-id> [--pr] # publish all epic-owned chains; auto-finalizes PASS chains
126
125
 
127
- # Merge (for standalone chains only)
128
- specialists merge <chain-root-bead> [--rebuild] # publish ONE standalone chain
126
+ # Merge (per-chain or standalone; PASS chains can merge inside an active epic)
127
+ specialists merge <chain-root-bead> [--rebuild]
128
+ specialists finalize <chain-root-bead> # manual recovery if PASS auto-finalize did not fire
129
129
 
130
130
  # Session close (chain-aware, epic-aware)
131
131
  specialists end [--pr] # close session, publish via merge or PR
@@ -682,14 +682,15 @@ sp epic list --unresolved # show non-terminal epics
682
682
 
683
683
  # Inspect one epic
684
684
  sp epic status unitAI-3f7b
685
- # Shows: persisted_state, readiness_state, chains[], blockers[], summary
685
+ # Shows: derived readiness state, persisted state (audit only), chains[], blockers[], summary
686
686
 
687
- # Transition states (manual)
688
- sp epic resolve unitAI-3f7b # open resolving
689
-
690
- # Publish
691
- sp epic merge unitAI-3f7b # merge_ready → merged
687
+ # Publish (no manual state transition — readiness is derived live)
688
+ sp epic merge unitAI-3f7b # batch publish all chains; auto-finalizes PASS chains
692
689
  sp epic merge unitAI-3f7b --pr # PR mode
690
+
691
+ # Or per-chain (PASS chain inside active epic is allowed)
692
+ sp merge <chain-root-bead>
693
+ sp finalize <chain-root-bead> # manual recovery if PASS auto-finalize missed
693
694
  ```
694
695
 
695
696
  ### Conflict handling
@@ -1136,7 +1137,7 @@ sp stop <job-id> --force
1136
1137
 
1137
1138
  ### 5) `sp end` open-state loop fix
1138
1139
 
1139
- If `sp end` detects open-state mismatch, tool now suggests `sp epic resolve <epic-id>` as next command (no redirect loop).
1140
+ If `sp end` detects open-state mismatch, tool surfaces the derived readiness summary (`sp epic status <epic-id>`) and the per-chain merge path. There is no `sp epic resolve` anymore — readiness is recomputed live from chain state.
1140
1141
 
1141
1142
  - **RPC timeout on worktree job start** (30s, `command id=1`) → pi runs `npm install` in fresh
1142
1143
  worktrees if `.pi/settings.json` lists local packages. Root cause: worktree gets a stale copy
@@ -0,0 +1,137 @@
1
+ ---
2
+ name: using-specialists-auto
3
+ description: >
4
+ Operator-offline autonomous orchestration overlay. Activate when the user says
5
+ "auto mode", "full auto", "run autonomously", "I'll leave you alone", or
6
+ similar — and hands over a multi-item priority list. Layers on top of
7
+ `using-specialists-v3`: paranoid pacing, dispatch loop shape, dist-rebuild
8
+ discipline, escalation triggers specific to unsupervised runs. Does NOT
9
+ duplicate v3's bead contracts, sleep table, rebuttal patterns, escalation
10
+ matrix, or session-end handoff — refers to v3 for those.
11
+ version: 2.0
12
+ ---
13
+
14
+ # Using Specialists — Auto Mode (overlay)
15
+
16
+ You are running unsupervised. Every shortcut you skip costs the operator on return. Move slowly enough to be correct.
17
+
18
+ `using-specialists-v3` is the canonical specialist orchestration skill — bead contracts, role selection, advisory passes, sleep cadence, rebuttal patterns, escalation matrix, session-end handoff all live there. This skill adds **only** the discipline overlay that changes when no operator is present to catch drift.
19
+
20
+ ## When this skill activates
21
+
22
+ User explicitly hands over autonomy: "auto mode", "go", "I'll leave you alone", "run the list", "do them all". Skill stays active until session end or the operator returns. Do NOT activate on a single ad-hoc task.
23
+
24
+ ## Auto-mode-specific rules (in addition to v3 hard rules)
25
+
26
+ These EXTEND v3's Non-Negotiable Rules + Escalation Matrix — they do not replace them.
27
+
28
+ 1. **Default to serial chains.** Auto-mode rarely benefits from parallel chains; the project-wide commit gate (v3 → Bead Lifecycle) forces serial-tail anyway. Only parallelize when file scopes are provably disjoint AND the time savings outweigh the conflict-resolution cost (rare).
29
+ 2. **Re-read each bead and defend each field in your head before launching.** If you can't, the bead isn't ready. Title-only beads waste a turn.
30
+ 3. **Rebuild + smoke after each P0 (and after every chain touching `src/`).** Skipping breaks the next chain's baseline silently.
31
+ 4. **One rebuttal per reviewer, then escalate.** v3 documents the rebuttal pattern — auto-mode just caps the loop count.
32
+ 5. **Session-close report is non-optional.** Operator returning to a clean tree but no report = blind cold-start next session. Follow `/session-close-report` skill at session end.
33
+
34
+ ## Per-item loop shape
35
+
36
+ ```
37
+ read bead → write 7-section contract (child impl bead) → bd dep add parent→child
38
+ → sp run executor --bead <impl> --keep-alive --context-depth 3 --background
39
+ → sleep 10 && sp ps # confirm started, not stuck queued
40
+ → sleep <role-typical from v3> & sp ps # check (see v3 Monitoring section)
41
+ → sp result <exec-job> # consume immediately on transition to waiting
42
+ → optional advisory passes per v3 (code-sanity if smelly, security-auditor if risk surface)
43
+ → write reviewer bead contract → sp run reviewer --bead <review> --job <exec-job> --background
44
+ → sleep 90 & sp ps
45
+ → sp result <reviewer-job>
46
+ → PASS? → sp finalize <exec> → sp merge → rebuild dist → smoke → close chain (memory ack first)
47
+ → PARTIAL? → resume executor with exact findings → resume reviewer
48
+ → FAIL with valid evidence? → stop and report (file follow-up bead)
49
+ → FAIL with overcautious gate? → rebut once with cited evidence (v3 → Specialist Rebuttal As Routine)
50
+ ```
51
+
52
+ ## Dist rebuild + commit after every P0 or src/-touching chain
53
+
54
+ ```bash
55
+ bun build src/index.ts --target=bun --outfile=dist/index.js
56
+ sed -i '1s|#!/usr/bin/env node|#!/usr/bin/env bun|' dist/index.js
57
+ chmod +x dist/index.js
58
+ git add dist/index.js dist/types/<changed-paths> 2>/dev/null
59
+ git commit -m "build: rebuild dist after <bead-id> <one-line summary>"
60
+ ```
61
+
62
+ Without this, the next chain's tests/smokes run against stale dist and the globally-installed `sp` binary (symlinked to local `dist/index.js`) silently uses pre-fix behavior.
63
+
64
+ ## Smoke per chain
65
+
66
+ Tighter than v3's E2E Smoke Phase (which is integration-end). Per-chain smoke is:
67
+
68
+ - `bunx tsc --noEmit` clean
69
+ - The targeted test(s) the chain added — green
70
+ - After P0 also: `sp --version`, the specific CLI surface that changed, and (if runtime resolution touched) the same command from a non-repo cwd (`cd /tmp/smoke && sp <cmd>`)
71
+
72
+ If any chain in the session touched auth/secrets/input/dep-lock surface, do v3's cross-cutting security-auditor pass once at end before session close.
73
+
74
+ ## Pre-merge state hygiene (transitional, until v3.14.2 ships globally)
75
+
76
+ `sp merge` now ignores `.beads/` and `.xtrm/skills/active/**` (per `unitAI-pqe96` shipped this session). The globally-installed `sp` symlinks to local `dist/index.js`, so after `npm install -g .` the fix is live locally. If you still see `sp merge` refuse on dirty state, the leftover is usually a STAGED `.beads/issues.jsonl` (`M ` not ` M`):
77
+
78
+ ```bash
79
+ git restore --staged .beads/issues.jsonl 2>/dev/null
80
+ git checkout -- .beads/issues.jsonl 2>/dev/null
81
+ sp merge <chain-root-bead>
82
+ ```
83
+
84
+ In the worktree, drop noise stash before merging if `.xtrm/skills/active/...` files are dirty:
85
+
86
+ ```bash
87
+ git stash push -u -m "noise" -- .xtrm/
88
+ ```
89
+
90
+ After merge cleanup: `git worktree remove <path> --force`, `git branch -D feature/<bead>-<role>`, `git worktree prune`, `rm -rf .worktrees/<bead>`.
91
+
92
+ ## Auto-mode-specific escalation triggers
93
+
94
+ These supplement v3's Escalation Matrix — stop and report when:
95
+
96
+ - Reviewer FAIL twice after one rebuttal attempt (v3 rebuttal limit hit).
97
+ - Any chain looped twice with no progress.
98
+ - Repeated specialist crashes (>2 same role).
99
+ - Cross-project state pollution (specialists from another repo holding locks/processes).
100
+ - Anything that would otherwise require a v3 hard-rule break.
101
+
102
+ When you stop: file an issue bead with concrete evidence (PIDs, job IDs, exact error), save a memory if the failure mode is durable, write a partial session-close report, do NOT abandon mid-merge.
103
+
104
+ ## Session start (auto-specific)
105
+
106
+ In addition to v3's session-start patterns (`bd prime`, `bv --robot-triage`):
107
+
108
+ ```bash
109
+ specialists list --full # confirm current roles + models (registry may have drifted)
110
+ sp ps # 0 active expected
111
+ git worktree list # main only expected (specialist worktrees from prior sessions should be cleaned)
112
+ git status -s # clean expected
113
+ bd ready # work to pick up
114
+ ```
115
+
116
+ If any of these are dirty (active jobs, lingering worktrees, dirty tree from prior session), reconcile before claiming new work.
117
+
118
+ ## Session close (mandatory)
119
+
120
+ Per v3 → At Session End — Mandatory Handoff. Auto-mode addenda:
121
+
122
+ 1. Confirm `sp ps` empty (0 running, 0 waiting) and `git worktree list` shows only main.
123
+ 2. Drop accumulated stashes if they contain only known noise.
124
+ 3. Memory gate at session level: `bd kv set "memory-gate-done:<session-id>" "saved: <durable-insights>"` (or `"nothing novel: <reason>"`).
125
+ 4. Run `/session-close-report` skill — fills the canonical report template, drives CHANGELOG sync, commit, push.
126
+
127
+ ## Telltale signs you're drifting from auto-mode discipline
128
+
129
+ - Skipping bead contracts because "the change is small" → write it anyway, costs nothing, downstream specialist needs it.
130
+ - Polling `sp ps` more often than v3's sleep table → wastes context.
131
+ - Letting executors run >2× expected without `sp feed` → blocking future work.
132
+ - Accepting reviewer FAIL without cited evidence in the rebuttal → produces longer loops.
133
+ - Manually editing a config file because "the executor would just do the same thing" → breaks v3 hard rule 13 (orchestrator never edits code), no audit trail.
134
+ - Skipping `bun run build` after src/ change → next chain's smoke fails for unrelated reason.
135
+ - Closing the parent bead before chain memory saved → loses durable insight forever.
136
+
137
+ Read once at session start. Re-read if you catch yourself drifting.