devrites 6.0.3 → 6.1.0

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 (785) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +24 -9
  3. package/SECURITY.md +9 -6
  4. package/bin/devrites.mjs +28 -12
  5. package/docs/adr/0035-claude-root-leaves-plan-mode.md +33 -0
  6. package/docs/adr/0036-archive-recall-is-a-read-time-query.md +32 -0
  7. package/docs/adr/README.md +4 -2
  8. package/docs/cli.md +25 -2
  9. package/docs/command-map.md +10 -8
  10. package/docs/engine/commands.md +10 -7
  11. package/docs/harness-compliance.md +2 -2
  12. package/docs/orchestration.md +5 -4
  13. package/docs/release.md +4 -4
  14. package/docs/skills.md +2 -2
  15. package/engine/commands.go +1 -1
  16. package/engine/help.go +10 -6
  17. package/engine/internal/acceptance/cli.go +4 -1
  18. package/engine/internal/acceptance/exec.go +11 -11
  19. package/engine/internal/devritespaths/paths.go +5 -0
  20. package/engine/internal/hostpack/hostpack.go +48 -3
  21. package/engine/internal/install/apply.go +68 -1
  22. package/engine/internal/install/binary.go +4 -0
  23. package/engine/internal/install/install.go +25 -15
  24. package/engine/internal/install/merge.go +287 -123
  25. package/engine/internal/install/preflight.go +71 -1
  26. package/engine/internal/install/uninstall.go +7 -1
  27. package/engine/internal/install/update.go +7 -3
  28. package/engine/internal/lib/claims.go +30 -14
  29. package/engine/internal/lib/cli_observe.go +6 -0
  30. package/engine/internal/lib/context.go +35 -12
  31. package/engine/internal/lib/diffscope.go +79 -3
  32. package/engine/internal/lib/dispatch.go +78 -12
  33. package/engine/internal/lib/drift.go +9 -2
  34. package/engine/internal/lib/handoff.go +14 -5
  35. package/engine/internal/lib/metrics.go +103 -10
  36. package/engine/internal/lib/migrate.go +30 -12
  37. package/engine/internal/lib/next.go +22 -2
  38. package/engine/internal/lib/observe_summary.go +8 -0
  39. package/engine/internal/lib/open_visual.go +3 -1
  40. package/engine/internal/lib/recall.go +355 -0
  41. package/engine/internal/lib/regression.go +20 -0
  42. package/engine/internal/lib/resolve.go +96 -53
  43. package/engine/internal/lib/secretscan.go +24 -1
  44. package/engine/internal/lib/taskgraph.go +31 -1
  45. package/engine/internal/lib/util.go +18 -7
  46. package/engine/internal/lib/windows.go +68 -15
  47. package/engine/internal/markdowntext/markdowntext.go +45 -6
  48. package/engine/internal/notes/cli.go +5 -3
  49. package/engine/internal/notes/notes.go +8 -3
  50. package/engine/internal/overhaul/admit/run.go +16 -12
  51. package/engine/internal/overhaul/overhaul.go +1 -0
  52. package/engine/internal/overhaul/records/check.go +52 -9
  53. package/engine/internal/overhaul/render/run.go +3 -2
  54. package/engine/internal/overhaul/snapshot/run.go +2 -2
  55. package/engine/internal/parallel/git.go +5 -6
  56. package/engine/internal/parallel/ops.go +3 -0
  57. package/engine/internal/parallel/pathdisjoint.go +9 -4
  58. package/engine/internal/release/release.go +11 -9
  59. package/engine/internal/safepath/safepath.go +17 -1
  60. package/engine/internal/state/budgets.go +8 -4
  61. package/engine/internal/state/feature.go +3 -1
  62. package/engine/internal/state/observation.go +12 -7
  63. package/engine/internal/state/taskgraph.go +67 -12
  64. package/engine/internal/state/write.go +7 -1
  65. package/engine/main.go +6 -2
  66. package/pack/.claude/agents/_shared/composition-overhaul.md +2 -0
  67. package/pack/.claude/agents/devrites-devex-reviewer.md +5 -0
  68. package/pack/.claude/agents/devrites-evidence-scout.md +4 -0
  69. package/pack/.claude/agents/devrites-plan-reviewer.md +4 -1
  70. package/pack/.claude/agents/devrites-slice-wright.md +4 -1
  71. package/pack/.claude/agents/overhaul-implementer.md +1 -0
  72. package/pack/.claude/settings.json +4 -4
  73. package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -1
  74. package/pack/.claude/skills/devrites-audit/SKILL.md +1 -1
  75. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +1 -1
  76. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +3 -2
  77. package/pack/.claude/skills/devrites-doubt/SKILL.md +1 -1
  78. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  79. package/pack/.claude/skills/devrites-interview/SKILL.md +1 -1
  80. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +3 -3
  81. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  82. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  83. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  84. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  85. package/pack/.claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  86. package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  87. package/pack/.claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  88. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  89. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  90. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  91. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  92. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -1
  93. package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -1
  94. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -1
  95. package/pack/.claude/skills/overhaul/references/orchestration.md +6 -2
  96. package/pack/.claude/skills/overhaul/references/records.md +8 -3
  97. package/pack/.claude/skills/rite/SKILL.md +4 -3
  98. package/pack/.claude/skills/rite/reference/menu.md +6 -5
  99. package/pack/.claude/skills/rite-adopt/SKILL.md +4 -3
  100. package/pack/.claude/skills/rite-autocomplete/SKILL.md +6 -5
  101. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +2 -1
  102. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  103. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +3 -1
  104. package/pack/.claude/skills/rite-build/reference/output.md +1 -1
  105. package/pack/.claude/skills/rite-build/reference/phase-contract.md +2 -0
  106. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  107. package/pack/.claude/skills/rite-converge/SKILL.md +4 -3
  108. package/pack/.claude/skills/rite-customize/SKILL.md +1 -1
  109. package/pack/.claude/skills/rite-define/SKILL.md +3 -2
  110. package/pack/.claude/skills/rite-doctor/SKILL.md +12 -6
  111. package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
  112. package/pack/.claude/skills/rite-explain/SKILL.md +1 -1
  113. package/pack/.claude/skills/rite-fast/SKILL.md +3 -1
  114. package/pack/.claude/skills/rite-handoff/SKILL.md +4 -3
  115. package/pack/.claude/skills/rite-learn/SKILL.md +2 -2
  116. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  117. package/pack/.claude/skills/rite-plan/reference/slicing.md +3 -1
  118. package/pack/.claude/skills/rite-pov/SKILL.md +1 -1
  119. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +5 -4
  120. package/pack/.claude/skills/rite-pressure-test/SKILL.md +7 -5
  121. package/pack/.claude/skills/rite-prototype/SKILL.md +1 -1
  122. package/pack/.claude/skills/rite-quick/SKILL.md +10 -5
  123. package/pack/.claude/skills/rite-resolve/SKILL.md +3 -3
  124. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  125. package/pack/.claude/skills/rite-review/SKILL.md +2 -1
  126. package/pack/.claude/skills/rite-seal/SKILL.md +3 -3
  127. package/pack/.claude/skills/rite-seal/reference/go-no-go.md +2 -0
  128. package/pack/.claude/skills/rite-seal/reference/seal-template.md +5 -2
  129. package/pack/.claude/skills/rite-ship/reference/close-out.md +3 -2
  130. package/pack/.claude/skills/rite-spec/SKILL.md +4 -1
  131. package/pack/.claude/skills/rite-status/SKILL.md +1 -1
  132. package/pack/.claude/skills/rite-temper/reference/significance.md +2 -0
  133. package/pack/.claude/skills/rite-upgrade/SKILL.md +4 -2
  134. package/pack/.claude/skills/rite-vet/SKILL.md +3 -2
  135. package/pack/.claude/skills/rite-vet/reference/artifacts.md +1 -1
  136. package/pack/.claude/skills/rite-watch-pr/SKILL.md +1 -1
  137. package/pack/.claude/skills/rite-zoom-out/SKILL.md +1 -1
  138. package/pack/generated/claude/agents/devrites-devex-reviewer.md +5 -0
  139. package/pack/generated/claude/agents/devrites-evidence-scout.md +4 -0
  140. package/pack/generated/claude/agents/devrites-plan-reviewer.md +4 -1
  141. package/pack/generated/claude/agents/devrites-slice-wright.md +4 -1
  142. package/pack/generated/claude/agents/overhaul-backend-engineer.md +2 -0
  143. package/pack/generated/claude/agents/overhaul-boundary.md +2 -0
  144. package/pack/generated/claude/agents/overhaul-craft.md +2 -0
  145. package/pack/generated/claude/agents/overhaul-frontend-engineer.md +2 -0
  146. package/pack/generated/claude/agents/overhaul-implementer.md +3 -0
  147. package/pack/generated/claude/agents/overhaul-recon.md +2 -0
  148. package/pack/generated/claude/agents/overhaul-specialist.md +2 -0
  149. package/pack/generated/claude/agents/overhaul-verifier.md +2 -0
  150. package/pack/generated/claude/settings.json +4 -4
  151. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -1
  152. package/pack/generated/claude/skills/devrites-audit/SKILL.md +1 -1
  153. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +1 -1
  154. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +3 -2
  155. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +1 -1
  156. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  157. package/pack/generated/claude/skills/devrites-interview/SKILL.md +1 -1
  158. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +3 -3
  159. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  160. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  161. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  162. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  163. package/pack/generated/claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  164. package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  165. package/pack/generated/claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  166. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  167. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  168. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  169. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  170. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +1 -1
  171. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +1 -1
  172. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +1 -1
  173. package/pack/generated/claude/skills/overhaul/references/orchestration.md +6 -2
  174. package/pack/generated/claude/skills/overhaul/references/records.md +8 -3
  175. package/pack/generated/claude/skills/rite/SKILL.md +4 -3
  176. package/pack/generated/claude/skills/rite/reference/menu.md +6 -5
  177. package/pack/generated/claude/skills/rite-adopt/SKILL.md +4 -3
  178. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +6 -5
  179. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +2 -1
  180. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  181. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +3 -1
  182. package/pack/generated/claude/skills/rite-build/reference/output.md +1 -1
  183. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +2 -0
  184. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  185. package/pack/generated/claude/skills/rite-converge/SKILL.md +4 -3
  186. package/pack/generated/claude/skills/rite-customize/SKILL.md +1 -1
  187. package/pack/generated/claude/skills/rite-define/SKILL.md +3 -2
  188. package/pack/generated/claude/skills/rite-doctor/SKILL.md +12 -6
  189. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
  190. package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -1
  191. package/pack/generated/claude/skills/rite-fast/SKILL.md +3 -1
  192. package/pack/generated/claude/skills/rite-handoff/SKILL.md +4 -3
  193. package/pack/generated/claude/skills/rite-learn/SKILL.md +2 -2
  194. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  195. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +3 -1
  196. package/pack/generated/claude/skills/rite-pov/SKILL.md +1 -1
  197. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +5 -4
  198. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +7 -5
  199. package/pack/generated/claude/skills/rite-prototype/SKILL.md +1 -1
  200. package/pack/generated/claude/skills/rite-quick/SKILL.md +10 -5
  201. package/pack/generated/claude/skills/rite-resolve/SKILL.md +3 -3
  202. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  203. package/pack/generated/claude/skills/rite-review/SKILL.md +2 -1
  204. package/pack/generated/claude/skills/rite-seal/SKILL.md +3 -3
  205. package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +2 -0
  206. package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +5 -2
  207. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +3 -2
  208. package/pack/generated/claude/skills/rite-spec/SKILL.md +4 -1
  209. package/pack/generated/claude/skills/rite-status/SKILL.md +1 -1
  210. package/pack/generated/claude/skills/rite-temper/reference/significance.md +2 -0
  211. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +4 -2
  212. package/pack/generated/claude/skills/rite-vet/SKILL.md +3 -2
  213. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +1 -1
  214. package/pack/generated/claude/skills/rite-watch-pr/SKILL.md +1 -1
  215. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +1 -1
  216. package/pack/generated/codex/agents/devrites-code-reviewer.toml +7 -7
  217. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +6 -1
  218. package/pack/generated/codex/agents/devrites-evidence-scout.toml +4 -0
  219. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +1 -1
  220. package/pack/generated/codex/agents/devrites-plan-drafter.toml +3 -3
  221. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +5 -2
  222. package/pack/generated/codex/agents/devrites-proof-runner.toml +2 -2
  223. package/pack/generated/codex/agents/devrites-security-auditor.toml +1 -1
  224. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +1 -1
  225. package/pack/generated/codex/agents/devrites-slice-wright.toml +8 -5
  226. package/pack/generated/codex/agents/devrites-test-analyst.toml +5 -5
  227. package/pack/generated/codex/agents/devrites-upgrade-planner.toml +1 -1
  228. package/pack/generated/codex/agents/fast-builder.toml +3 -3
  229. package/pack/generated/codex/agents/fast-critic.toml +3 -3
  230. package/pack/generated/codex/agents/overhaul-backend-engineer.toml +2 -0
  231. package/pack/generated/codex/agents/overhaul-boundary.toml +2 -0
  232. package/pack/generated/codex/agents/overhaul-craft.toml +2 -0
  233. package/pack/generated/codex/agents/overhaul-frontend-engineer.toml +2 -0
  234. package/pack/generated/codex/agents/overhaul-implementer.toml +2 -0
  235. package/pack/generated/codex/agents/overhaul-recon.toml +2 -0
  236. package/pack/generated/codex/agents/overhaul-specialist.toml +2 -0
  237. package/pack/generated/codex/agents/overhaul-verifier.toml +2 -0
  238. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +1 -1
  239. package/pack/generated/codex/skills/devrites-audit/SKILL.md +1 -1
  240. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +1 -1
  241. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +3 -2
  242. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +1 -1
  243. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +1 -1
  244. package/pack/generated/codex/skills/devrites-interview/SKILL.md +1 -1
  245. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +3 -3
  246. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  247. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  248. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +1 -1
  249. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  250. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +1 -1
  251. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +1 -1
  252. package/pack/generated/codex/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  253. package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  254. package/pack/generated/codex/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  255. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +2 -0
  256. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  257. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +13 -0
  258. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  259. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +1 -1
  260. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +1 -1
  261. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +1 -1
  262. package/pack/generated/codex/skills/overhaul/SKILL.md +15 -15
  263. package/pack/generated/codex/skills/overhaul/references/audit-domains.md +2 -2
  264. package/pack/generated/codex/skills/overhaul/references/orchestration.md +11 -7
  265. package/pack/generated/codex/skills/overhaul/references/records.md +8 -3
  266. package/pack/generated/codex/skills/rite/SKILL.md +4 -3
  267. package/pack/generated/codex/skills/rite/reference/menu.md +6 -5
  268. package/pack/generated/codex/skills/rite-adopt/SKILL.md +4 -3
  269. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +7 -6
  270. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +2 -1
  271. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  272. package/pack/generated/codex/skills/rite-build/SKILL.md +2 -2
  273. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +3 -1
  274. package/pack/generated/codex/skills/rite-build/reference/output.md +1 -1
  275. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +1 -1
  276. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +2 -0
  277. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +20 -1
  278. package/pack/generated/codex/skills/rite-clarify/SKILL.md +1 -1
  279. package/pack/generated/codex/skills/rite-converge/SKILL.md +5 -4
  280. package/pack/generated/codex/skills/rite-customize/SKILL.md +1 -1
  281. package/pack/generated/codex/skills/rite-define/SKILL.md +4 -3
  282. package/pack/generated/codex/skills/rite-doctor/SKILL.md +12 -6
  283. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +2 -2
  284. package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -1
  285. package/pack/generated/codex/skills/rite-fast/SKILL.md +8 -6
  286. package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -1
  287. package/pack/generated/codex/skills/rite-handoff/SKILL.md +4 -3
  288. package/pack/generated/codex/skills/rite-learn/SKILL.md +2 -2
  289. package/pack/generated/codex/skills/rite-plan/SKILL.md +1 -1
  290. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +2 -0
  291. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +3 -1
  292. package/pack/generated/codex/skills/rite-polish/SKILL.md +2 -2
  293. package/pack/generated/codex/skills/rite-pov/SKILL.md +1 -1
  294. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -4
  295. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +7 -5
  296. package/pack/generated/codex/skills/rite-prototype/SKILL.md +1 -1
  297. package/pack/generated/codex/skills/rite-prove/SKILL.md +1 -1
  298. package/pack/generated/codex/skills/rite-quick/SKILL.md +11 -6
  299. package/pack/generated/codex/skills/rite-resolve/SKILL.md +3 -3
  300. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +4 -5
  301. package/pack/generated/codex/skills/rite-review/SKILL.md +3 -2
  302. package/pack/generated/codex/skills/rite-seal/SKILL.md +4 -4
  303. package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +2 -0
  304. package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +5 -2
  305. package/pack/generated/codex/skills/rite-ship/SKILL.md +1 -1
  306. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +3 -2
  307. package/pack/generated/codex/skills/rite-spec/SKILL.md +5 -2
  308. package/pack/generated/codex/skills/rite-status/SKILL.md +1 -1
  309. package/pack/generated/codex/skills/rite-temper/SKILL.md +2 -2
  310. package/pack/generated/codex/skills/rite-temper/reference/significance.md +2 -0
  311. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +4 -2
  312. package/pack/generated/codex/skills/rite-vet/SKILL.md +4 -3
  313. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +1 -1
  314. package/pack/generated/codex/skills/rite-watch-pr/SKILL.md +1 -1
  315. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +1 -1
  316. package/pack/generated/devin/AGENTS.md +1 -1
  317. package/pack/generated/devin/agents/devrites-devex-reviewer.md +5 -0
  318. package/pack/generated/devin/agents/devrites-evidence-scout.md +4 -0
  319. package/pack/generated/devin/agents/devrites-plan-reviewer.md +4 -1
  320. package/pack/generated/devin/agents/devrites-slice-wright.md +4 -1
  321. package/pack/generated/devin/agents/overhaul-backend-engineer.md +2 -0
  322. package/pack/generated/devin/agents/overhaul-boundary.md +2 -0
  323. package/pack/generated/devin/agents/overhaul-craft.md +2 -0
  324. package/pack/generated/devin/agents/overhaul-frontend-engineer.md +2 -0
  325. package/pack/generated/devin/agents/overhaul-implementer.md +2 -0
  326. package/pack/generated/devin/agents/overhaul-recon.md +2 -0
  327. package/pack/generated/devin/agents/overhaul-specialist.md +2 -0
  328. package/pack/generated/devin/agents/overhaul-verifier.md +2 -0
  329. package/pack/generated/devin/skills/devrites-api-interface/SKILL.md +1 -1
  330. package/pack/generated/devin/skills/devrites-audit/SKILL.md +1 -1
  331. package/pack/generated/devin/skills/devrites-browser-proof/SKILL.md +1 -1
  332. package/pack/generated/devin/skills/devrites-debug-recovery/SKILL.md +3 -2
  333. package/pack/generated/devin/skills/devrites-doubt/SKILL.md +1 -1
  334. package/pack/generated/devin/skills/devrites-frontend-craft/SKILL.md +1 -1
  335. package/pack/generated/devin/skills/devrites-interview/SKILL.md +2 -2
  336. package/pack/generated/devin/skills/devrites-lib/reference/intent-map.md +3 -3
  337. package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  338. package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +8 -7
  339. package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +1 -1
  340. package/pack/generated/devin/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  341. package/pack/generated/devin/skills/devrites-lib/reference/standards/code-review.md +1 -1
  342. package/pack/generated/devin/skills/devrites-lib/reference/standards/core.md +1 -1
  343. package/pack/generated/devin/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  344. package/pack/generated/devin/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  345. package/pack/generated/devin/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  346. package/pack/generated/devin/skills/devrites-lib/reference/standards/performance.md +2 -0
  347. package/pack/generated/devin/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  348. package/pack/generated/devin/skills/devrites-lib/reference/standards/testing.md +13 -0
  349. package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  350. package/pack/generated/devin/skills/devrites-prose-craft/SKILL.md +1 -1
  351. package/pack/generated/devin/skills/devrites-source-driven/SKILL.md +1 -1
  352. package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +1 -1
  353. package/pack/generated/devin/skills/overhaul/SKILL.md +15 -15
  354. package/pack/generated/devin/skills/overhaul/references/audit-domains.md +2 -2
  355. package/pack/generated/devin/skills/overhaul/references/orchestration.md +11 -7
  356. package/pack/generated/devin/skills/overhaul/references/records.md +8 -3
  357. package/pack/generated/devin/skills/rite/SKILL.md +4 -3
  358. package/pack/generated/devin/skills/rite/reference/menu.md +6 -5
  359. package/pack/generated/devin/skills/rite-adopt/SKILL.md +4 -3
  360. package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +8 -7
  361. package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  362. package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +2 -1
  363. package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +3 -2
  364. package/pack/generated/devin/skills/rite-build/SKILL.md +2 -2
  365. package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +3 -1
  366. package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  367. package/pack/generated/devin/skills/rite-build/reference/output.md +1 -1
  368. package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +1 -1
  369. package/pack/generated/devin/skills/rite-build/reference/phase-contract.md +2 -0
  370. package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +20 -1
  371. package/pack/generated/devin/skills/rite-clarify/SKILL.md +1 -1
  372. package/pack/generated/devin/skills/rite-converge/SKILL.md +5 -4
  373. package/pack/generated/devin/skills/rite-customize/SKILL.md +1 -1
  374. package/pack/generated/devin/skills/rite-define/SKILL.md +4 -3
  375. package/pack/generated/devin/skills/rite-doctor/SKILL.md +12 -6
  376. package/pack/generated/devin/skills/rite-dogfood/SKILL.md +2 -2
  377. package/pack/generated/devin/skills/rite-explain/SKILL.md +3 -3
  378. package/pack/generated/devin/skills/rite-explain/reference/intake.md +1 -1
  379. package/pack/generated/devin/skills/rite-fast/SKILL.md +8 -6
  380. package/pack/generated/devin/skills/rite-frame/SKILL.md +1 -1
  381. package/pack/generated/devin/skills/rite-handoff/SKILL.md +4 -3
  382. package/pack/generated/devin/skills/rite-learn/SKILL.md +2 -2
  383. package/pack/generated/devin/skills/rite-plan/SKILL.md +1 -1
  384. package/pack/generated/devin/skills/rite-plan/reference/replan-and-repair.md +2 -0
  385. package/pack/generated/devin/skills/rite-plan/reference/slicing.md +3 -1
  386. package/pack/generated/devin/skills/rite-polish/SKILL.md +2 -2
  387. package/pack/generated/devin/skills/rite-pov/SKILL.md +1 -1
  388. package/pack/generated/devin/skills/rite-pr-feedback/SKILL.md +5 -4
  389. package/pack/generated/devin/skills/rite-pressure-test/SKILL.md +7 -5
  390. package/pack/generated/devin/skills/rite-prototype/SKILL.md +1 -1
  391. package/pack/generated/devin/skills/rite-prove/SKILL.md +1 -1
  392. package/pack/generated/devin/skills/rite-quick/SKILL.md +11 -6
  393. package/pack/generated/devin/skills/rite-resolve/SKILL.md +4 -4
  394. package/pack/generated/devin/skills/rite-resolve/reference/answer-protocol.md +4 -5
  395. package/pack/generated/devin/skills/rite-review/SKILL.md +3 -2
  396. package/pack/generated/devin/skills/rite-seal/SKILL.md +4 -4
  397. package/pack/generated/devin/skills/rite-seal/reference/go-no-go.md +2 -0
  398. package/pack/generated/devin/skills/rite-seal/reference/seal-template.md +5 -2
  399. package/pack/generated/devin/skills/rite-ship/SKILL.md +1 -1
  400. package/pack/generated/devin/skills/rite-ship/reference/close-out.md +3 -2
  401. package/pack/generated/devin/skills/rite-spec/SKILL.md +5 -2
  402. package/pack/generated/devin/skills/rite-spec/reference/investigation.md +1 -1
  403. package/pack/generated/devin/skills/rite-status/SKILL.md +1 -1
  404. package/pack/generated/devin/skills/rite-temper/SKILL.md +3 -3
  405. package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +1 -1
  406. package/pack/generated/devin/skills/rite-temper/reference/significance.md +3 -1
  407. package/pack/generated/devin/skills/rite-upgrade/SKILL.md +4 -2
  408. package/pack/generated/devin/skills/rite-vet/SKILL.md +4 -3
  409. package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +1 -1
  410. package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +2 -2
  411. package/pack/generated/devin/skills/rite-watch-pr/SKILL.md +1 -1
  412. package/pack/generated/devin/skills/rite-zoom-out/SKILL.md +1 -1
  413. package/pack/generated/omp/agents/devrites-code-reviewer.md +7 -7
  414. package/pack/generated/omp/agents/devrites-devex-reviewer.md +6 -1
  415. package/pack/generated/omp/agents/devrites-evidence-scout.md +4 -0
  416. package/pack/generated/omp/agents/devrites-frontend-reviewer.md +1 -1
  417. package/pack/generated/omp/agents/devrites-plan-drafter.md +3 -3
  418. package/pack/generated/omp/agents/devrites-plan-reviewer.md +5 -2
  419. package/pack/generated/omp/agents/devrites-proof-runner.md +2 -2
  420. package/pack/generated/omp/agents/devrites-security-auditor.md +1 -1
  421. package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +1 -1
  422. package/pack/generated/omp/agents/devrites-slice-wright.md +8 -5
  423. package/pack/generated/omp/agents/devrites-test-analyst.md +5 -5
  424. package/pack/generated/omp/agents/devrites-upgrade-planner.md +1 -1
  425. package/pack/generated/omp/agents/fast-builder.md +3 -3
  426. package/pack/generated/omp/agents/fast-critic.md +3 -3
  427. package/pack/generated/omp/agents/overhaul-backend-engineer.md +2 -0
  428. package/pack/generated/omp/agents/overhaul-boundary.md +2 -0
  429. package/pack/generated/omp/agents/overhaul-craft.md +2 -0
  430. package/pack/generated/omp/agents/overhaul-frontend-engineer.md +2 -0
  431. package/pack/generated/omp/agents/overhaul-implementer.md +2 -0
  432. package/pack/generated/omp/agents/overhaul-recon.md +2 -0
  433. package/pack/generated/omp/agents/overhaul-specialist.md +2 -0
  434. package/pack/generated/omp/agents/overhaul-verifier.md +2 -0
  435. package/pack/generated/omp/commands/rite-resolve.md +1 -1
  436. package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +4 -4
  437. package/pack/generated/omp/skills/devrites-audit/SKILL.md +5 -5
  438. package/pack/generated/omp/skills/devrites-browser-proof/SKILL.md +5 -5
  439. package/pack/generated/omp/skills/devrites-browser-proof/reference/browser-performance.md +1 -1
  440. package/pack/generated/omp/skills/devrites-browser-proof/reference/visual-verdict.md +1 -1
  441. package/pack/generated/omp/skills/devrites-debug-recovery/SKILL.md +7 -6
  442. package/pack/generated/omp/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +1 -1
  443. package/pack/generated/omp/skills/devrites-doubt/SKILL.md +6 -6
  444. package/pack/generated/omp/skills/devrites-frontend-craft/SKILL.md +3 -3
  445. package/pack/generated/omp/skills/devrites-frontend-craft/reference/craft.md +1 -1
  446. package/pack/generated/omp/skills/devrites-frontend-craft/reference/design-references.md +4 -4
  447. package/pack/generated/omp/skills/devrites-frontend-craft/reference/fullstack.md +1 -1
  448. package/pack/generated/omp/skills/devrites-frontend-craft/reference/quality-standards.md +8 -8
  449. package/pack/generated/omp/skills/devrites-frontend-craft/reference/reuse-first.md +2 -2
  450. package/pack/generated/omp/skills/devrites-frontend-craft/reference/shape.md +2 -2
  451. package/pack/generated/omp/skills/devrites-interview/SKILL.md +3 -3
  452. package/pack/generated/omp/skills/devrites-lib/reference/intent-map.md +4 -4
  453. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +8 -7
  454. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +13 -12
  455. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +6 -6
  456. package/pack/generated/omp/skills/devrites-lib/reference/standards/browser-proof-checklist.md +2 -2
  457. package/pack/generated/omp/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  458. package/pack/generated/omp/skills/devrites-lib/reference/standards/code-review.md +3 -3
  459. package/pack/generated/omp/skills/devrites-lib/reference/standards/coding-style.md +1 -1
  460. package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +2 -2
  461. package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +3 -3
  462. package/pack/generated/omp/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  463. package/pack/generated/omp/skills/devrites-lib/reference/standards/debug-recovery.md +1 -1
  464. package/pack/generated/omp/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  465. package/pack/generated/omp/skills/devrites-lib/reference/standards/developer-experience.md +8 -3
  466. package/pack/generated/omp/skills/devrites-lib/reference/standards/glossary.md +3 -3
  467. package/pack/generated/omp/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  468. package/pack/generated/omp/skills/devrites-lib/reference/standards/performance.md +3 -1
  469. package/pack/generated/omp/skills/devrites-lib/reference/standards/prose-style.md +4 -4
  470. package/pack/generated/omp/skills/devrites-lib/reference/standards/release/ship-checklist.md +1 -1
  471. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/README.md +1 -1
  472. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/ci-workflows.md +1 -1
  473. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/react.md +1 -1
  474. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/stack-profile.md +5 -5
  475. package/pack/generated/omp/skills/devrites-lib/reference/standards/skill-authoring.md +15 -3
  476. package/pack/generated/omp/skills/devrites-lib/reference/standards/spec-grammar.md +3 -3
  477. package/pack/generated/omp/skills/devrites-lib/reference/standards/testing.md +14 -1
  478. package/pack/generated/omp/skills/devrites-lib/reference/standards/tooling.md +1 -1
  479. package/pack/generated/omp/skills/devrites-lib/reference/standards/verification-methods.md +1 -1
  480. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/index.md +2 -2
  481. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +12 -8
  482. package/pack/generated/omp/skills/devrites-prose-craft/SKILL.md +4 -4
  483. package/pack/generated/omp/skills/devrites-prose-craft/reference/examples.md +1 -1
  484. package/pack/generated/omp/skills/devrites-source-driven/SKILL.md +3 -3
  485. package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +10 -10
  486. package/pack/generated/omp/skills/devrites-ux-shape/reference/brief-template.md +3 -3
  487. package/pack/generated/omp/skills/devrites-ux-shape/reference/visual-direction-probe.md +1 -1
  488. package/pack/generated/omp/skills/overhaul/references/orchestration.md +6 -2
  489. package/pack/generated/omp/skills/overhaul/references/records.md +8 -3
  490. package/pack/generated/omp/skills/rite/SKILL.md +8 -7
  491. package/pack/generated/omp/skills/rite/reference/menu.md +6 -5
  492. package/pack/generated/omp/skills/rite-adopt/SKILL.md +6 -5
  493. package/pack/generated/omp/skills/rite-adopt/reference/anti-patterns.md +1 -1
  494. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +11 -10
  495. package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  496. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +4 -3
  497. package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  498. package/pack/generated/omp/skills/rite-build/SKILL.md +7 -7
  499. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +4 -2
  500. package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +1 -1
  501. package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  502. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +2 -2
  503. package/pack/generated/omp/skills/rite-build/reference/frontend-trigger.md +1 -1
  504. package/pack/generated/omp/skills/rite-build/reference/output.md +1 -1
  505. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +4 -4
  506. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +8 -6
  507. package/pack/generated/omp/skills/rite-build/reference/tdd.md +1 -1
  508. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +27 -8
  509. package/pack/generated/omp/skills/rite-clarify/SKILL.md +4 -4
  510. package/pack/generated/omp/skills/rite-clarify/reference/anti-patterns.md +1 -1
  511. package/pack/generated/omp/skills/rite-converge/SKILL.md +16 -15
  512. package/pack/generated/omp/skills/rite-converge/reference/convergence-assessment.md +4 -4
  513. package/pack/generated/omp/skills/rite-customize/SKILL.md +2 -2
  514. package/pack/generated/omp/skills/rite-define/SKILL.md +25 -24
  515. package/pack/generated/omp/skills/rite-define/reference/anti-patterns.md +2 -2
  516. package/pack/generated/omp/skills/rite-define/reference/gates.md +2 -2
  517. package/pack/generated/omp/skills/rite-doctor/SKILL.md +12 -6
  518. package/pack/generated/omp/skills/rite-dogfood/SKILL.md +5 -5
  519. package/pack/generated/omp/skills/rite-explain/SKILL.md +7 -7
  520. package/pack/generated/omp/skills/rite-explain/reference/intake.md +1 -1
  521. package/pack/generated/omp/skills/rite-fast/SKILL.md +12 -10
  522. package/pack/generated/omp/skills/rite-fast/reference/artifacts.md +1 -1
  523. package/pack/generated/omp/skills/rite-frame/SKILL.md +6 -6
  524. package/pack/generated/omp/skills/rite-frame/reference/failure-modes.md +4 -4
  525. package/pack/generated/omp/skills/rite-handoff/SKILL.md +7 -6
  526. package/pack/generated/omp/skills/rite-learn/SKILL.md +6 -6
  527. package/pack/generated/omp/skills/rite-plan/SKILL.md +8 -8
  528. package/pack/generated/omp/skills/rite-plan/reference/anti-patterns.md +1 -1
  529. package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +3 -1
  530. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +6 -4
  531. package/pack/generated/omp/skills/rite-plan/reference/task-breakdown.md +1 -1
  532. package/pack/generated/omp/skills/rite-polish/SKILL.md +6 -6
  533. package/pack/generated/omp/skills/rite-polish/reference/anti-ai-slop.md +9 -9
  534. package/pack/generated/omp/skills/rite-polish/reference/anti-patterns.md +1 -1
  535. package/pack/generated/omp/skills/rite-polish/reference/backend-polish.md +2 -2
  536. package/pack/generated/omp/skills/rite-polish/reference/browser-polish-evidence.md +1 -1
  537. package/pack/generated/omp/skills/rite-polish/reference/code.md +8 -8
  538. package/pack/generated/omp/skills/rite-polish/reference/design-memory.md +3 -3
  539. package/pack/generated/omp/skills/rite-polish/reference/design-system-discovery.md +1 -1
  540. package/pack/generated/omp/skills/rite-polish/reference/harden-checklist.md +1 -1
  541. package/pack/generated/omp/skills/rite-polish/reference/ledger.md +3 -3
  542. package/pack/generated/omp/skills/rite-polish/reference/ui.md +1 -1
  543. package/pack/generated/omp/skills/rite-pov/SKILL.md +2 -2
  544. package/pack/generated/omp/skills/rite-pr-feedback/SKILL.md +6 -5
  545. package/pack/generated/omp/skills/rite-pressure-test/SKILL.md +9 -7
  546. package/pack/generated/omp/skills/rite-prototype/SKILL.md +1 -1
  547. package/pack/generated/omp/skills/rite-prove/SKILL.md +13 -13
  548. package/pack/generated/omp/skills/rite-prove/reference/acceptance-proof.md +7 -7
  549. package/pack/generated/omp/skills/rite-prove/reference/anti-patterns.md +1 -1
  550. package/pack/generated/omp/skills/rite-prove/reference/browser-proof.md +3 -3
  551. package/pack/generated/omp/skills/rite-prove/reference/failure-triage.md +2 -2
  552. package/pack/generated/omp/skills/rite-quick/SKILL.md +19 -14
  553. package/pack/generated/omp/skills/rite-resolve/SKILL.md +6 -6
  554. package/pack/generated/omp/skills/rite-resolve/reference/answer-protocol.md +4 -5
  555. package/pack/generated/omp/skills/rite-review/SKILL.md +23 -22
  556. package/pack/generated/omp/skills/rite-review/reference/anti-patterns.md +1 -1
  557. package/pack/generated/omp/skills/rite-review/reference/cognitive-load.md +2 -2
  558. package/pack/generated/omp/skills/rite-review/reference/nielsen-heuristics.md +1 -1
  559. package/pack/generated/omp/skills/rite-review/reference/performance-checklist.md +1 -1
  560. package/pack/generated/omp/skills/rite-review/reference/performance-review.md +1 -1
  561. package/pack/generated/omp/skills/rite-review/reference/security-review.md +2 -2
  562. package/pack/generated/omp/skills/rite-seal/SKILL.md +11 -11
  563. package/pack/generated/omp/skills/rite-seal/reference/anti-patterns.md +1 -1
  564. package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +3 -3
  565. package/pack/generated/omp/skills/rite-seal/reference/go-no-go.md +3 -1
  566. package/pack/generated/omp/skills/rite-seal/reference/output.md +1 -1
  567. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +4 -4
  568. package/pack/generated/omp/skills/rite-seal/reference/seal-template.md +5 -2
  569. package/pack/generated/omp/skills/rite-ship/SKILL.md +7 -7
  570. package/pack/generated/omp/skills/rite-ship/reference/anti-patterns.md +1 -1
  571. package/pack/generated/omp/skills/rite-ship/reference/close-out.md +5 -4
  572. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +2 -2
  573. package/pack/generated/omp/skills/rite-ship/reference/rollout.md +3 -3
  574. package/pack/generated/omp/skills/rite-spec/SKILL.md +17 -14
  575. package/pack/generated/omp/skills/rite-spec/reference/anti-patterns.md +1 -1
  576. package/pack/generated/omp/skills/rite-spec/reference/investigation.md +3 -3
  577. package/pack/generated/omp/skills/rite-spec/reference/question-protocol.md +1 -1
  578. package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +2 -2
  579. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +8 -8
  580. package/pack/generated/omp/skills/rite-status/SKILL.md +2 -2
  581. package/pack/generated/omp/skills/rite-temper/SKILL.md +13 -13
  582. package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +2 -2
  583. package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +3 -3
  584. package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +3 -3
  585. package/pack/generated/omp/skills/rite-temper/reference/significance.md +4 -2
  586. package/pack/generated/omp/skills/rite-upgrade/SKILL.md +7 -5
  587. package/pack/generated/omp/skills/rite-vet/SKILL.md +14 -13
  588. package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +2 -2
  589. package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +3 -3
  590. package/pack/generated/omp/skills/rite-vet/reference/depth.md +3 -3
  591. package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +5 -5
  592. package/pack/generated/omp/skills/rite-watch-pr/SKILL.md +2 -2
  593. package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +1 -1
  594. package/pack/generated/pi/agents/devrites-devex-reviewer.md +5 -0
  595. package/pack/generated/pi/agents/devrites-evidence-scout.md +4 -0
  596. package/pack/generated/pi/agents/devrites-plan-reviewer.md +4 -1
  597. package/pack/generated/pi/agents/devrites-slice-wright.md +4 -1
  598. package/pack/generated/pi/agents/overhaul-backend-engineer.md +2 -0
  599. package/pack/generated/pi/agents/overhaul-boundary.md +2 -0
  600. package/pack/generated/pi/agents/overhaul-craft.md +2 -0
  601. package/pack/generated/pi/agents/overhaul-frontend-engineer.md +2 -0
  602. package/pack/generated/pi/agents/overhaul-implementer.md +2 -0
  603. package/pack/generated/pi/agents/overhaul-recon.md +2 -0
  604. package/pack/generated/pi/agents/overhaul-specialist.md +2 -0
  605. package/pack/generated/pi/agents/overhaul-verifier.md +2 -0
  606. package/pack/generated/pi/prompts/rite-resolve.md +1 -1
  607. package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +1 -1
  608. package/pack/generated/pi/skills/devrites-audit/SKILL.md +1 -1
  609. package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +1 -1
  610. package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +3 -2
  611. package/pack/generated/pi/skills/devrites-doubt/SKILL.md +1 -1
  612. package/pack/generated/pi/skills/devrites-frontend-craft/SKILL.md +1 -1
  613. package/pack/generated/pi/skills/devrites-interview/SKILL.md +1 -1
  614. package/pack/generated/pi/skills/devrites-lib/reference/intent-map.md +3 -3
  615. package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  616. package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  617. package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +1 -1
  618. package/pack/generated/pi/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  619. package/pack/generated/pi/skills/devrites-lib/reference/standards/code-review.md +1 -1
  620. package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +1 -1
  621. package/pack/generated/pi/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  622. package/pack/generated/pi/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  623. package/pack/generated/pi/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  624. package/pack/generated/pi/skills/devrites-lib/reference/standards/performance.md +2 -0
  625. package/pack/generated/pi/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  626. package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +13 -0
  627. package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  628. package/pack/generated/pi/skills/devrites-prose-craft/SKILL.md +1 -1
  629. package/pack/generated/pi/skills/devrites-source-driven/SKILL.md +1 -1
  630. package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +1 -1
  631. package/pack/generated/pi/skills/overhaul/SKILL.md +15 -15
  632. package/pack/generated/pi/skills/overhaul/references/audit-domains.md +2 -2
  633. package/pack/generated/pi/skills/overhaul/references/orchestration.md +11 -7
  634. package/pack/generated/pi/skills/overhaul/references/records.md +8 -3
  635. package/pack/generated/pi/skills/rite/SKILL.md +4 -3
  636. package/pack/generated/pi/skills/rite/reference/menu.md +6 -5
  637. package/pack/generated/pi/skills/rite-adopt/SKILL.md +4 -3
  638. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +7 -6
  639. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +2 -1
  640. package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  641. package/pack/generated/pi/skills/rite-build/SKILL.md +2 -2
  642. package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +3 -1
  643. package/pack/generated/pi/skills/rite-build/reference/output.md +1 -1
  644. package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +1 -1
  645. package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +2 -0
  646. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +20 -1
  647. package/pack/generated/pi/skills/rite-clarify/SKILL.md +1 -1
  648. package/pack/generated/pi/skills/rite-converge/SKILL.md +5 -4
  649. package/pack/generated/pi/skills/rite-customize/SKILL.md +1 -1
  650. package/pack/generated/pi/skills/rite-define/SKILL.md +4 -3
  651. package/pack/generated/pi/skills/rite-doctor/SKILL.md +12 -6
  652. package/pack/generated/pi/skills/rite-dogfood/SKILL.md +2 -2
  653. package/pack/generated/pi/skills/rite-explain/SKILL.md +1 -1
  654. package/pack/generated/pi/skills/rite-fast/SKILL.md +8 -6
  655. package/pack/generated/pi/skills/rite-frame/SKILL.md +1 -1
  656. package/pack/generated/pi/skills/rite-handoff/SKILL.md +4 -3
  657. package/pack/generated/pi/skills/rite-learn/SKILL.md +2 -2
  658. package/pack/generated/pi/skills/rite-plan/SKILL.md +1 -1
  659. package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +2 -0
  660. package/pack/generated/pi/skills/rite-plan/reference/slicing.md +3 -1
  661. package/pack/generated/pi/skills/rite-polish/SKILL.md +2 -2
  662. package/pack/generated/pi/skills/rite-pov/SKILL.md +1 -1
  663. package/pack/generated/pi/skills/rite-pr-feedback/SKILL.md +5 -4
  664. package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +7 -5
  665. package/pack/generated/pi/skills/rite-prototype/SKILL.md +1 -1
  666. package/pack/generated/pi/skills/rite-prove/SKILL.md +1 -1
  667. package/pack/generated/pi/skills/rite-quick/SKILL.md +11 -6
  668. package/pack/generated/pi/skills/rite-resolve/SKILL.md +3 -3
  669. package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +4 -5
  670. package/pack/generated/pi/skills/rite-review/SKILL.md +3 -2
  671. package/pack/generated/pi/skills/rite-seal/SKILL.md +4 -4
  672. package/pack/generated/pi/skills/rite-seal/reference/go-no-go.md +2 -0
  673. package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +5 -2
  674. package/pack/generated/pi/skills/rite-ship/SKILL.md +1 -1
  675. package/pack/generated/pi/skills/rite-ship/reference/close-out.md +3 -2
  676. package/pack/generated/pi/skills/rite-spec/SKILL.md +5 -2
  677. package/pack/generated/pi/skills/rite-status/SKILL.md +1 -1
  678. package/pack/generated/pi/skills/rite-temper/SKILL.md +2 -2
  679. package/pack/generated/pi/skills/rite-temper/reference/significance.md +2 -0
  680. package/pack/generated/pi/skills/rite-upgrade/SKILL.md +4 -2
  681. package/pack/generated/pi/skills/rite-vet/SKILL.md +4 -3
  682. package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +1 -1
  683. package/pack/generated/pi/skills/rite-watch-pr/SKILL.md +1 -1
  684. package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +1 -1
  685. package/package.json +3 -2
  686. package/scripts/build-host-artifacts.sh +13 -0
  687. package/scripts/codex-generate.sh +5 -1
  688. package/scripts/devin-generate.sh +4 -3
  689. package/scripts/install-lib.sh +5 -0
  690. package/scripts/omp-generate.sh +23 -1
  691. package/scripts/pi-generate.sh +2 -2
  692. package/engine/cmd/releasepack/main_test.go +0 -239
  693. package/engine/harnessmatrix_test.go +0 -46
  694. package/engine/help_test.go +0 -241
  695. package/engine/internal/acceptance/acceptance_test.go +0 -946
  696. package/engine/internal/devritespaths/paths_test.go +0 -128
  697. package/engine/internal/fsutil/copy_test.go +0 -154
  698. package/engine/internal/gate/gate_test.go +0 -865
  699. package/engine/internal/gate/readiness_binding_test.go +0 -443
  700. package/engine/internal/gitenv/env_test.go +0 -48
  701. package/engine/internal/hostpack/hostpack_test.go +0 -269
  702. package/engine/internal/install/install_test.go +0 -1741
  703. package/engine/internal/install/workspace_advisory_test.go +0 -54
  704. package/engine/internal/lib/candidate_test.go +0 -506
  705. package/engine/internal/lib/claims_test.go +0 -267
  706. package/engine/internal/lib/closeout_test.go +0 -266
  707. package/engine/internal/lib/context_next_test.go +0 -860
  708. package/engine/internal/lib/cursor_compat_test.go +0 -65
  709. package/engine/internal/lib/detect_test.go +0 -118
  710. package/engine/internal/lib/drift_test.go +0 -135
  711. package/engine/internal/lib/dup_test.go +0 -666
  712. package/engine/internal/lib/environment_report_test.go +0 -54
  713. package/engine/internal/lib/evidencefresh_test.go +0 -120
  714. package/engine/internal/lib/handoff_test.go +0 -83
  715. package/engine/internal/lib/manifest_union_test.go +0 -251
  716. package/engine/internal/lib/metrics_test.go +0 -28
  717. package/engine/internal/lib/migrate_test.go +0 -213
  718. package/engine/internal/lib/observe_budgets_test.go +0 -396
  719. package/engine/internal/lib/open_visual_test.go +0 -291
  720. package/engine/internal/lib/regression_test.go +0 -282
  721. package/engine/internal/lib/resolve_remediation_test.go +0 -192
  722. package/engine/internal/lib/secretscan_test.go +0 -556
  723. package/engine/internal/lib/slicecheck_test.go +0 -170
  724. package/engine/internal/lib/taskgraph_test.go +0 -353
  725. package/engine/internal/lib/triggers_test.go +0 -23
  726. package/engine/internal/lib/util_test.go +0 -148
  727. package/engine/internal/lib/visual_outline_test.go +0 -189
  728. package/engine/internal/lib/windows_test.go +0 -420
  729. package/engine/internal/lib/workspace_read_test.go +0 -102
  730. package/engine/internal/markdowntext/markdowntext_fuzz_test.go +0 -36
  731. package/engine/internal/markdowntext/markdowntext_test.go +0 -58
  732. package/engine/internal/markdowntext/testdata/structural.json +0 -277
  733. package/engine/internal/notes/notes_test.go +0 -545
  734. package/engine/internal/overhaul/admit/admit_test.go +0 -204
  735. package/engine/internal/overhaul/admit/packet_test.go +0 -223
  736. package/engine/internal/overhaul/bench/run_test.go +0 -316
  737. package/engine/internal/overhaul/ovio/ovio_test.go +0 -75
  738. package/engine/internal/overhaul/packet/packet_test.go +0 -263
  739. package/engine/internal/overhaul/records/init_test.go +0 -96
  740. package/engine/internal/overhaul/records/records_test.go +0 -696
  741. package/engine/internal/overhaul/records/run_test.go +0 -77
  742. package/engine/internal/overhaul/render/run_test.go +0 -928
  743. package/engine/internal/overhaul/score/run_test.go +0 -636
  744. package/engine/internal/overhaul/snapshot/run_test.go +0 -718
  745. package/engine/internal/parallel/cli_test.go +0 -91
  746. package/engine/internal/parallel/ops_test.go +0 -939
  747. package/engine/internal/parallel/parallel_test.go +0 -645
  748. package/engine/internal/parallel/pathdisjoint_fuzz_test.go +0 -43
  749. package/engine/internal/parallel/pathdisjoint_test.go +0 -193
  750. package/engine/internal/parallel/select_test.go +0 -95
  751. package/engine/internal/parallel/testdata/fuzz/FuzzPathDisjoint/a449b81b4711b7b4 +0 -3
  752. package/engine/internal/reason/reason_test.go +0 -37
  753. package/engine/internal/release/release_test.go +0 -181
  754. package/engine/internal/rootfacts/facts_test.go +0 -364
  755. package/engine/internal/safepath/safepath_fuzz_test.go +0 -21
  756. package/engine/internal/safepath/safepath_test.go +0 -69
  757. package/engine/internal/safepath/safepath_windows_test.go +0 -26
  758. package/engine/internal/state/acceptance_test.go +0 -57
  759. package/engine/internal/state/budgets_test.go +0 -135
  760. package/engine/internal/state/cmd/workflowmanifest/main_test.go +0 -96
  761. package/engine/internal/state/concurrency_test.go +0 -184
  762. package/engine/internal/state/cursor_fuzz_test.go +0 -80
  763. package/engine/internal/state/cursor_test.go +0 -276
  764. package/engine/internal/state/observation_test.go +0 -961
  765. package/engine/internal/state/observation_unix_test.go +0 -68
  766. package/engine/internal/state/state_test.go +0 -986
  767. package/engine/internal/state/taskgraph_fuzz_test.go +0 -38
  768. package/engine/internal/state/taskgraph_test.go +0 -43
  769. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/114b28f68c1fa4db +0 -4
  770. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/378a0f2218e812ea +0 -4
  771. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/39eaa26fcb481e3c +0 -4
  772. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/776ca1dc0143acf0 +0 -4
  773. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/9295930c1ebb81df +0 -4
  774. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/a60de309dc33be0d +0 -4
  775. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f04dc7b06ef7c99f +0 -4
  776. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f3000ac510878bd6 +0 -4
  777. package/engine/internal/state/testdata/fuzz/FuzzWorkspaceSchemaRow/a75aabb9f2a847d5 +0 -2
  778. package/engine/internal/state/workspaceschema_fuzz_test.go +0 -27
  779. package/engine/internal/state/workspaceschema_test.go +0 -101
  780. package/engine/internal/state/write_test.go +0 -136
  781. package/engine/internal/version/version_test.go +0 -29
  782. package/engine/internal/workflow/commands_test.go +0 -18
  783. package/engine/note_routing_test.go +0 -95
  784. package/engine/observation_contract_test.go +0 -175
  785. package/engine/root_routing_test.go +0 -340
@@ -0,0 +1,355 @@
1
+ package lib
2
+
3
+ import (
4
+ "errors"
5
+ "fmt"
6
+ "io"
7
+ "io/fs"
8
+ "os"
9
+ "path/filepath"
10
+ "regexp"
11
+ "sort"
12
+ "strconv"
13
+ "strings"
14
+ "time"
15
+ "unicode"
16
+
17
+ "github.com/devrites/devrites/internal/devritespaths"
18
+ "github.com/devrites/devrites/internal/markdowntext"
19
+ "github.com/devrites/devrites/internal/parallel"
20
+ )
21
+
22
+ // RecallUsage is the help and usage-error text for `recall`.
23
+ const RecallUsage = `usage: devrites-engine recall --paths <p1,p2,...> [--paths <p>]... [--limit n]
24
+
25
+ Lists archived features (.devrites/archive/<slug>/) whose touched-files.md
26
+ candidate manifest covers a queried project-relative path: exact or as a
27
+ directory prefix, case-folded. Ranked by overlap count, then newest archive
28
+ directory mtime, then slug; --limit caps the features shown (default 10).
29
+ Each feature prints up to 8 pointers (then "+N more"): decisions.md DEC-###
30
+ entries and ## Carry-forward constraints bullets whose Files: overlap (or a
31
+ constraint naming no files), and review.md/seal.md/drift.md lines that mention
32
+ a queried path. Fenced examples are ignored. Pointer files are relative to
33
+ .devrites. Read-only: computed on every call; nothing is written, cached, or
34
+ indexed. An unreadable archive entry prints "unreadable:" and the scan goes on.
35
+ Exit 0 ok (including no archive or no match), 1 invalid archive directory, 2 usage.`
36
+
37
+ const (
38
+ recallDefaultLimit = 10
39
+ recallPointerCap = 8
40
+ recallClipRunes = 120
41
+ )
42
+
43
+ // recallPointerFiles are scanned in this order; decisions.md is structural,
44
+ // the rest are searched for path mentions.
45
+ var recallPointerFiles = []string{"decisions.md", "review.md", "seal.md", "drift.md"}
46
+
47
+ var recallDecisionHeading = regexp.MustCompile(`^#{1,6}[ \t]+DEC-[0-9]+`)
48
+
49
+ type recallFeature struct {
50
+ slug string
51
+ dir string
52
+ mtime time.Time
53
+ matched []string // queried paths the manifest covers, in query order
54
+ }
55
+
56
+ // RunRecall answers "what did earlier features decide or find about these
57
+ // paths" by reading the archive on every call (ADR-0014/ADR-0022 forbid an
58
+ // engine index or ledger). It never writes, not even a metric.
59
+ func RunRecall(root string, args []string, stdout, stderr io.Writer) int {
60
+ queries, limit, ok := parseRecallArgs(args, stderr)
61
+ if !ok {
62
+ return 2
63
+ }
64
+ archiveDir, err := devritespaths.ArchiveDirChecked(root)
65
+ if err != nil {
66
+ fmt.Fprintf(stderr, "recall: invalid archive directory: %v\n", err)
67
+ return 1
68
+ }
69
+ entries, err := os.ReadDir(archiveDir)
70
+ if errors.Is(err, fs.ErrNotExist) {
71
+ fmt.Fprintln(stdout, "recall: no archive")
72
+ return 0
73
+ }
74
+ if err != nil {
75
+ fmt.Fprintf(stderr, "recall: read archive: %v\n", err)
76
+ return 1
77
+ }
78
+ var features []recallFeature
79
+ var unreadable []string
80
+ for _, entry := range entries {
81
+ name := entry.Name()
82
+ // Hidden scratch dirs and stray files are not archived features.
83
+ if strings.HasPrefix(name, ".") || entry.Type().IsRegular() {
84
+ continue
85
+ }
86
+ label := "archive/" + name
87
+ dir, err := devritespaths.ExistingArchivedFeatureDirChecked(root, name)
88
+ if err != nil {
89
+ unreadable = append(unreadable, fmt.Sprintf("%s (%v)", label, err))
90
+ continue
91
+ }
92
+ raw, err := readBoundedRegularFile(filepath.Join(dir, "touched-files.md"), maxCandidateManifestBytes)
93
+ if errors.Is(err, fs.ErrNotExist) {
94
+ continue // never built: touched nothing
95
+ }
96
+ var rows []candidateRow
97
+ if err == nil {
98
+ rows, err = parseCandidateManifest(raw)
99
+ }
100
+ if err != nil {
101
+ unreadable = append(unreadable, fmt.Sprintf("%s/touched-files.md (%v)", label, err))
102
+ continue
103
+ }
104
+ matched := recallMatched(queries, rows)
105
+ if len(matched) == 0 {
106
+ continue
107
+ }
108
+ feature := recallFeature{slug: name, dir: dir, matched: matched}
109
+ if info, err := entry.Info(); err == nil {
110
+ feature.mtime = info.ModTime()
111
+ }
112
+ features = append(features, feature)
113
+ }
114
+ sort.SliceStable(features, func(i, j int) bool {
115
+ a, b := features[i], features[j]
116
+ if len(a.matched) != len(b.matched) {
117
+ return len(a.matched) > len(b.matched)
118
+ }
119
+ if !a.mtime.Equal(b.mtime) {
120
+ return a.mtime.After(b.mtime)
121
+ }
122
+ return a.slug < b.slug
123
+ })
124
+ if len(features) == 0 {
125
+ fmt.Fprintln(stdout, "recall: no archived feature touched these paths")
126
+ } else {
127
+ fmt.Fprintf(stdout, "recall: %d archived feature(s) touched these paths\n", len(features))
128
+ if len(features) > limit {
129
+ fmt.Fprintf(stdout, "recall: truncated to %d feature(s) (--limit)\n", limit)
130
+ features = features[:limit]
131
+ }
132
+ for _, f := range features {
133
+ fmt.Fprintf(stdout, "feature %s overlap=%d paths=%s\n", f.slug, len(f.matched), strings.Join(f.matched, ","))
134
+ writeRecallPointers(stdout, f.dir, "archive/"+f.slug, queries)
135
+ }
136
+ }
137
+ for _, line := range unreadable {
138
+ fmt.Fprintf(stdout, "unreadable: %s\n", line)
139
+ }
140
+ return 0
141
+ }
142
+
143
+ func parseRecallArgs(args []string, stderr io.Writer) ([]string, int, bool) {
144
+ limit := recallDefaultLimit
145
+ var queries []string
146
+ seen := map[string]bool{}
147
+ for i := 0; i < len(args); i++ {
148
+ switch args[i] {
149
+ case "--paths":
150
+ value := argAt(args, i+1)
151
+ i++
152
+ if strings.TrimSpace(value) == "" || strings.HasPrefix(value, "-") {
153
+ fmt.Fprintln(stderr, "recall: --paths requires a comma-separated path list (not a flag)")
154
+ return nil, 0, false
155
+ }
156
+ for _, raw := range strings.Split(value, ",") {
157
+ if strings.TrimSpace(raw) == "" {
158
+ continue
159
+ }
160
+ path, err := parallel.NormalizePath(raw)
161
+ if err == nil && strings.HasPrefix(path, "-") {
162
+ err = fmt.Errorf("path must not look like a flag: %q", raw)
163
+ }
164
+ if err != nil {
165
+ fmt.Fprintf(stderr, "recall: --paths: %v\n", err)
166
+ return nil, 0, false
167
+ }
168
+ if key := strings.ToLower(path); !seen[key] {
169
+ seen[key] = true
170
+ queries = append(queries, path)
171
+ }
172
+ }
173
+ case "--limit":
174
+ n, err := strconv.Atoi(argAt(args, i+1))
175
+ if err != nil || n < 1 {
176
+ fmt.Fprintf(stderr, "recall: --limit expects a positive integer, got %q\n", argAt(args, i+1))
177
+ return nil, 0, false
178
+ }
179
+ limit = n
180
+ i++
181
+ default:
182
+ fmt.Fprintf(stderr, "recall: unexpected argument %q\n%s\n", args[i], RecallUsage)
183
+ return nil, 0, false
184
+ }
185
+ }
186
+ if len(queries) == 0 {
187
+ fmt.Fprintln(stderr, RecallUsage)
188
+ return nil, 0, false
189
+ }
190
+ return queries, limit, true
191
+ }
192
+
193
+ // recallMatched returns the queries covered by a manifest row, folding case
194
+ // and matching directory prefixes with the claim-overlap rule.
195
+ func recallMatched(queries []string, rows []candidateRow) []string {
196
+ var matched []string
197
+ for _, q := range queries {
198
+ for _, row := range rows {
199
+ if claimPathsOverlap(row.path, q) {
200
+ matched = append(matched, q)
201
+ break
202
+ }
203
+ }
204
+ }
205
+ return matched
206
+ }
207
+
208
+ func writeRecallPointers(w io.Writer, dir, label string, queries []string) {
209
+ var pointers, unreadable []string
210
+ for _, name := range recallPointerFiles {
211
+ raw, err := readBoundedRegularFile(filepath.Join(dir, name), maxCandidateArtifactBytes)
212
+ if errors.Is(err, fs.ErrNotExist) {
213
+ continue
214
+ }
215
+ if err == nil {
216
+ raw, err = markdowntext.Structural(raw)
217
+ }
218
+ if err != nil {
219
+ unreadable = append(unreadable, fmt.Sprintf("%s/%s (%v)", label, name, err))
220
+ continue
221
+ }
222
+ lines := strings.Split(string(raw), "\n")
223
+ var hits []int
224
+ if name == "decisions.md" {
225
+ hits = recallDecisionHits(lines, queries)
226
+ } else {
227
+ for i, line := range lines {
228
+ if recallMentions(line, queries) {
229
+ hits = append(hits, i)
230
+ }
231
+ }
232
+ }
233
+ for _, i := range hits {
234
+ pointers = append(pointers, fmt.Sprintf("%s/%s:%d %s", label, name, i+1, clipRunes(strings.TrimSpace(lines[i]), recallClipRunes)))
235
+ }
236
+ }
237
+ for i, p := range pointers {
238
+ if i == recallPointerCap {
239
+ fmt.Fprintf(w, " +%d more\n", len(pointers)-recallPointerCap)
240
+ break
241
+ }
242
+ fmt.Fprintf(w, " %s\n", p)
243
+ }
244
+ for _, u := range unreadable {
245
+ fmt.Fprintf(w, " unreadable: %s\n", u)
246
+ }
247
+ }
248
+
249
+ // recallDecisionHits returns the line indexes of DEC-### headings whose
250
+ // Files: field overlaps the queries, and of carry-forward constraint bullets
251
+ // that overlap or name no files. Fenced lines arrive already blanked.
252
+ func recallDecisionHits(lines []string, queries []string) []int {
253
+ var hits []int
254
+ dec, decDone, carry := -1, false, false
255
+ for i, line := range lines {
256
+ trimmed := strings.TrimSpace(line)
257
+ rest := strings.TrimLeft(trimmed, "#")
258
+ if level := len(trimmed) - len(rest); level > 0 && (rest == "" || rest[0] == ' ' || rest[0] == '\t') {
259
+ dec, decDone = -1, false
260
+ if recallDecisionHeading.MatchString(trimmed) {
261
+ dec = i
262
+ }
263
+ // As in handoff's dead ends, a ### subheading stays in the section.
264
+ if level <= 2 {
265
+ carry = strings.EqualFold(trimmed, "## Carry-forward constraints")
266
+ }
267
+ continue
268
+ }
269
+ if dec >= 0 {
270
+ if files, ok := recallFilesField(trimmed); ok && !decDone && recallOverlaps(files, queries) {
271
+ hits = append(hits, dec)
272
+ decDone = true
273
+ }
274
+ continue
275
+ }
276
+ entry, ok := strings.CutPrefix(trimmed, "- ")
277
+ if !carry || !ok || strings.TrimSpace(entry) == "" {
278
+ continue
279
+ }
280
+ var files []string
281
+ if at := strings.LastIndex(entry, "Files:"); at >= 0 {
282
+ files = recallPathList(entry[at+len("Files:"):])
283
+ }
284
+ if len(files) == 0 || recallOverlaps(files, queries) {
285
+ hits = append(hits, i)
286
+ }
287
+ }
288
+ return hits
289
+ }
290
+
291
+ // recallFilesField parses a `Files:` field line such as "- Files: a, b" or
292
+ // "**Files:** `a` `b`".
293
+ func recallFilesField(trimmed string) ([]string, bool) {
294
+ s := strings.TrimLeft(trimmed, "-*+ \t")
295
+ if !strings.HasPrefix(strings.ToLower(s), "files:") {
296
+ return nil, false
297
+ }
298
+ return recallPathList(strings.TrimLeft(s[len("files:"):], "* \t")), true
299
+ }
300
+
301
+ func recallPathList(s string) []string {
302
+ switch strings.ToLower(strings.TrimSpace(s)) {
303
+ case "", "none", "n/a", "-", "—":
304
+ return nil
305
+ }
306
+ var out []string
307
+ for _, field := range strings.FieldsFunc(s, func(r rune) bool { return r == ',' || r == ';' || unicode.IsSpace(r) }) {
308
+ field = strings.TrimSuffix(strings.Trim(field, "`'\"()[]"), ".")
309
+ if path, err := parallel.NormalizePath(field); err == nil {
310
+ out = append(out, path)
311
+ }
312
+ }
313
+ return out
314
+ }
315
+
316
+ func recallOverlaps(files, queries []string) bool {
317
+ for _, f := range files {
318
+ for _, q := range queries {
319
+ if claimPathsOverlap(f, q) {
320
+ return true
321
+ }
322
+ }
323
+ }
324
+ return false
325
+ }
326
+
327
+ // recallMentions reports a case-folded occurrence of a queried path that is
328
+ // not part of a longer path: "src/a.go" matches "`src/a.go:12`" but not
329
+ // "mysrc/a.go", "lib/src/a.go", or "src/a.gox".
330
+ func recallMentions(line string, queries []string) bool {
331
+ lower := strings.ToLower(line)
332
+ for _, q := range queries {
333
+ q = strings.ToLower(q)
334
+ for from := 0; from < len(lower); {
335
+ at := strings.Index(lower[from:], q)
336
+ if at < 0 {
337
+ break
338
+ }
339
+ start, end := from+at, from+at+len(q)
340
+ before := start == 0 || !recallPathByte(lower[start-1])
341
+ after := end == len(lower) || lower[end] == '/' || !recallPathByte(lower[end]) ||
342
+ lower[end] == '.' && (end+1 == len(lower) || !recallPathByte(lower[end+1]))
343
+ if before && after {
344
+ return true
345
+ }
346
+ from = start + 1
347
+ }
348
+ }
349
+ return false
350
+ }
351
+
352
+ func recallPathByte(c byte) bool {
353
+ return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' ||
354
+ c == '_' || c == '-' || c == '.' || c == '/' || c >= 0x80
355
+ }
@@ -7,7 +7,9 @@ import (
7
7
  "os"
8
8
  "path/filepath"
9
9
  "regexp"
10
+ "slices"
10
11
  "sort"
12
+ "strconv"
11
13
  "strings"
12
14
  "time"
13
15
 
@@ -49,6 +51,8 @@ var doneSliceStates = map[string]bool{
49
51
  var (
50
52
  regressACRe = regexp.MustCompile(`(?im)^[ \t]*- \[([xX ])\] (AC-\d+)`)
51
53
  regressSliceRe = regexp.MustCompile(`(?m)^## (SLICE-\d+)\b[^\n]*`)
54
+ regressBuiltRe = regexp.MustCompile(`(?m)^[ \t]*[-*] \[[xX]\][^\n]*`)
55
+ regressSliceIDRe = regexp.MustCompile(`(?i)\b(?:SLICE-|Slice )(\d+)\b`)
52
56
  regressStatusRe = regexp.MustCompile(`(?im)^Status:[ \t]*([^\s]+)`)
53
57
  regressQHeaderRe = regexp.MustCompile(`(?im)^## (q-\d{4}-\d{2}-\d{2}-\d+)\b`)
54
58
  regressQStatusRe = regexp.MustCompile(`(?im)^status:[ \t]*([^\s]+)`)
@@ -170,6 +174,22 @@ func fingerprintWorkspace(root, slug, workspace string) (progressFingerprint, er
170
174
  if err == nil {
171
175
  fp.DoneSlices = doneSlices(masked)
172
176
  }
177
+ // The canonical slice grammar has no Status field: Build records the
178
+ // built list in state.md as checked items naming the slice.
179
+ masked, err = maskedArtifact(workspace, "state.md")
180
+ note("state.md", err)
181
+ if err == nil {
182
+ for _, item := range regressBuiltRe.FindAllString(masked, -1) {
183
+ for _, m := range regressSliceIDRe.FindAllStringSubmatch(item, -1) {
184
+ // `SLICE-001` and `Slice 1` name the same slice.
185
+ n, _ := strconv.Atoi(m[1])
186
+ id := fmt.Sprintf("SLICE-%03d", n)
187
+ if !slices.Contains(fp.DoneSlices, id) {
188
+ fp.DoneSlices = append(fp.DoneSlices, id)
189
+ }
190
+ }
191
+ }
192
+ }
173
193
 
174
194
  raw, err := os.ReadFile(filepath.Join(workspace, acceptance.GatesFile)) // #nosec G304 -- workspace artifact
175
195
  note(acceptance.GatesFile, err)
@@ -6,10 +6,12 @@ import (
6
6
  "os"
7
7
  "path/filepath"
8
8
  "regexp"
9
+ "slices"
9
10
  "strings"
10
11
  "time"
11
12
 
12
13
  "github.com/devrites/devrites/internal/fsutil"
14
+ "github.com/devrites/devrites/internal/markdowntext"
13
15
  "github.com/devrites/devrites/internal/state"
14
16
  "github.com/devrites/devrites/internal/workflow"
15
17
  )
@@ -39,16 +41,17 @@ func Resolve(root string, args []string, stdout, stderr io.Writer) int {
39
41
  return fail(stderr, err.Error(), 3)
40
42
  }
41
43
 
42
- human := argAt(args, 0) == "--human"
43
- if human {
44
- args = args[1:]
45
- }
44
+ const usage = `Usage: devrites-engine state resolve [--human] <qid> "<answer>" | state resolve [--human] --drop <qid> ["<reason>"] | state resolve [--human] --batch <file>`
45
+ human := slices.Contains(args, "--human")
46
+ args = slices.DeleteFunc(slices.Clone(args), func(arg string) bool { return arg == "--human" })
46
47
  var mode, qid, payload string
48
+ maxArgs := 2
47
49
  switch first := argAt(args, 0); first {
48
50
  case "--drop":
49
51
  mode = "drop"
50
52
  qid = argAt(args, 1)
51
53
  payload = argAt(args, 2)
54
+ maxArgs = 3
52
55
  if payload == "" {
53
56
  payload = "dropped"
54
57
  }
@@ -59,7 +62,7 @@ func Resolve(root string, args []string, stdout, stderr io.Writer) int {
59
62
  return fail(stderr, "Batch file not found: "+payload, 5)
60
63
  }
61
64
  case "":
62
- return fail(stderr, `Usage: devrites-engine state resolve [--human] <qid> "<answer>" | state resolve [--human] --drop <qid> ["<reason>"] | state resolve [--human] --batch <file>`, 5)
65
+ return fail(stderr, usage, 5)
63
66
  default:
64
67
  mode = "answer"
65
68
  qid = first
@@ -68,6 +71,11 @@ func Resolve(root string, args []string, stdout, stderr io.Writer) int {
68
71
  return fail(stderr, "Answer text required for "+qid, 5)
69
72
  }
70
73
  }
74
+ // An unknown flag or a stray argument must never be recorded as a qid or
75
+ // an answer.
76
+ if len(args) > maxArgs || strings.HasPrefix(qid, "-") || mode != "batch" && strings.HasPrefix(payload, "--") {
77
+ return fail(stderr, usage, 5)
78
+ }
71
79
 
72
80
  code := 0
73
81
  if err := state.WithFeatureLock(root, slug, func() error {
@@ -107,31 +115,49 @@ func resolveMutation(mode, qid, payload, qfile, sfile string, human bool, stdout
107
115
  if err != nil {
108
116
  return fail(stderr, "Batch file not found: "+payload, 5)
109
117
  }
118
+ // Every line is parsed and applied in memory first, so a bad line
119
+ // leaves questions.md untouched instead of half-resolved.
120
+ type batchEntry struct{ qid, status, text string }
121
+ var entries []batchEntry
110
122
  for _, line := range batchLines(data) {
123
+ line = strings.TrimSpace(line)
111
124
  if line == "" || strings.HasPrefix(line, "#") {
112
125
  continue
113
126
  }
114
- if strings.HasPrefix(line, "--drop") {
115
- rest := strings.TrimPrefix(line, "--drop ")
116
- bid, reason := splitColon(rest)
117
- reason = strings.TrimPrefix(reason, " ")
118
- if code := resolveQuestion(qfile, bid, "dropped", reason, human, stderr); code != 0 {
119
- return code
120
- }
121
- if err := clearAwaiting(sfile, bid); err != nil {
122
- return fail(stderr, err.Error(), 1)
123
- }
124
- fmt.Fprintf(stdout, "Dropped: %s: %s\n", bid, reason)
127
+ status := "answered"
128
+ if rest, ok := strings.CutPrefix(line, "--drop "); ok {
129
+ status, line = "dropped", rest
130
+ }
131
+ bid, text, ok := strings.Cut(line, ":")
132
+ bid = strings.TrimSpace(bid)
133
+ if !ok || bid == "" || strings.HasPrefix(bid, "-") {
134
+ return fail(stderr, "Malformed batch line (want `<qid>: <answer>` or `--drop <qid>: <reason>`): "+line, 5)
135
+ }
136
+ entries = append(entries, batchEntry{bid, status, strings.TrimPrefix(text, " ")})
137
+ }
138
+ // #nosec G304 -- questions.md path inside the feature workspace
139
+ qdata, err := os.ReadFile(qfile)
140
+ if err != nil {
141
+ return fail(stderr, "questions.md missing at "+qfile, 2)
142
+ }
143
+ lines := splitLinesNoTrailing(qdata)
144
+ for _, entry := range entries {
145
+ var code int
146
+ if lines, code = applyResolution(lines, entry.qid, entry.status, entry.text, human, stderr); code != 0 {
147
+ return code
148
+ }
149
+ }
150
+ if err := fsutil.WriteFileAtomic(qfile, joinRecords(lines), 0o644); err != nil {
151
+ return fail(stderr, err.Error(), 1)
152
+ }
153
+ for _, entry := range entries {
154
+ if err := clearAwaiting(sfile, entry.qid); err != nil {
155
+ return fail(stderr, err.Error(), 1)
156
+ }
157
+ if entry.status == "dropped" {
158
+ fmt.Fprintf(stdout, "Dropped: %s: %s\n", entry.qid, entry.text)
125
159
  } else {
126
- bid, ans := splitColon(line)
127
- ans = strings.TrimPrefix(ans, " ")
128
- if code := resolveQuestion(qfile, bid, "answered", ans, human, stderr); code != 0 {
129
- return code
130
- }
131
- if err := clearAwaiting(sfile, bid); err != nil {
132
- return fail(stderr, err.Error(), 1)
133
- }
134
- fmt.Fprintf(stdout, "Resolved: %s\n", bid)
160
+ fmt.Fprintf(stdout, "Resolved: %s\n", entry.qid)
135
161
  }
136
162
  }
137
163
  }
@@ -171,16 +197,6 @@ func batchLines(data []byte) []string {
171
197
  return lines
172
198
  }
173
199
 
174
- // splitColon splits s at the first ':', returning the parts before and after it
175
- // (both the whole string when there is no ':').
176
- func splitColon(s string) (before, after string) {
177
- before, after, ok := strings.Cut(s, ":")
178
- if !ok {
179
- return s, s
180
- }
181
- return before, after
182
- }
183
-
184
200
  // clockNow is the resolve command's single wall-clock read. DEVRITES_NOW accepts
185
201
  // an RFC-3339 timestamp or YYYY-MM-DD date so tests can keep date-derived
186
202
  // question IDs stable. See ADR-0006.
@@ -210,16 +226,9 @@ func resolveQuestion(qfile, qid, status, answer string, human bool, stderr io.Wr
210
226
  if err != nil {
211
227
  return fail(stderr, "questions.md missing at "+qfile, 2)
212
228
  }
213
- ts := nowUTC()
214
- answer = oneLine(answer)
215
- target := regexp.MustCompile(`^## ` + regexp.QuoteMeta(qid) + `([[:space:]]|$)`)
216
-
217
- updated, found, notOpen := rewriteQuestionFields(splitLinesNoTrailing(data), target, status, answer, ts, human)
218
- if !found {
219
- return fail(stderr, "qid not found: "+qid, 3)
220
- }
221
- if notOpen {
222
- return fail(stderr, "qid not open (already answered/dropped): "+qid, 4)
229
+ updated, code := applyResolution(splitLinesNoTrailing(data), qid, status, answer, human, stderr)
230
+ if code != 0 {
231
+ return code
223
232
  }
224
233
  if err := fsutil.WriteFileAtomic(qfile, joinRecords(updated), 0o644); err != nil {
225
234
  return fail(stderr, err.Error(), 1)
@@ -228,10 +237,35 @@ func resolveQuestion(qfile, qid, status, answer string, human bool, stderr io.Wr
228
237
  return 0
229
238
  }
230
239
 
240
+ // applyResolution rewrites the <qid> block in the questions.md lines in memory.
241
+ // Returns 0, or 3 (qid not found) / 4 (qid not open), writing the message on
242
+ // failure.
243
+ func applyResolution(lines []string, qid, status, answer string, human bool, stderr io.Writer) ([]string, int) {
244
+ // Locate blocks on the fence-masked text, as the readiness gate does, so a
245
+ // fenced example is never rewritten and never shadows the real question.
246
+ var visible []string
247
+ if len(lines) > 0 {
248
+ masked, err := markdowntext.Structural([]byte(strings.Join(lines, "\n")))
249
+ if err != nil {
250
+ return nil, fail(stderr, "questions.md is not readable Markdown: "+err.Error(), 1)
251
+ }
252
+ visible = strings.Split(string(masked), "\n")
253
+ }
254
+ target := regexp.MustCompile(`^## ` + regexp.QuoteMeta(qid) + `([[:space:]]|$)`)
255
+ updated, found, notOpen := rewriteQuestionFields(lines, visible, target, status, oneLine(answer), nowUTC(), human)
256
+ if !found {
257
+ return nil, fail(stderr, "qid not found: "+qid, 3)
258
+ }
259
+ if notOpen {
260
+ return nil, fail(stderr, "qid not open (already answered/dropped): "+qid, 4)
261
+ }
262
+ return updated, 0
263
+ }
264
+
231
265
  var (
232
266
  qHeaderRe = regexp.MustCompile(`(?i)^## q-`)
233
- statusLineRe = regexp.MustCompile(`^status:`)
234
- statusStrip = regexp.MustCompile(`^status:[[:space:]]*`)
267
+ statusLineRe = regexp.MustCompile(`(?i)^status:`)
268
+ statusStrip = regexp.MustCompile(`(?i)^status:[[:space:]]*`)
235
269
  answeredAtRe = regexp.MustCompile(`^answered_at:`)
236
270
  answerRe = regexp.MustCompile(`^answer:`)
237
271
  answeredByRe = regexp.MustCompile(`(?i)^[[:space:]]*answered_by:`)
@@ -241,8 +275,9 @@ var (
241
275
  // block, sets status and rewrites any answered_at/answer lines already present. It
242
276
  // reports whether the block was found and whether it was already not open (an
243
277
  // attempt to re-answer). A target block with no status line at all gets a full set
244
- // of closing fields appended.
245
- func rewriteQuestionFields(lines []string, target *regexp.Regexp, status, answer, ts string, human bool) (out []string, found, notOpen bool) {
278
+ // of closing fields appended. Structure is matched on visible (lines with
279
+ // fenced blocks masked, same length); unmatched lines are copied from lines.
280
+ func rewriteQuestionFields(lines, visible []string, target *regexp.Regexp, status, answer, ts string, human bool) (out []string, found, notOpen bool) {
246
281
  inQ := false
247
282
  statusSeen, answeredAtSeen, answerSeen, answeredBySeen := false, false, false, false
248
283
  closeBlock := func() {
@@ -262,7 +297,8 @@ func rewriteQuestionFields(lines []string, target *regexp.Regexp, status, answer
262
297
  out = append(out, "answered_by: human")
263
298
  }
264
299
  }
265
- for _, line := range lines {
300
+ for i, original := range lines {
301
+ line := visible[i]
266
302
  switch {
267
303
  case qHeaderRe.MatchString(line):
268
304
  closeBlock()
@@ -271,11 +307,18 @@ func rewriteQuestionFields(lines []string, target *regexp.Regexp, status, answer
271
307
  if inQ {
272
308
  found = true
273
309
  }
274
- out = append(out, line)
310
+ out = append(out, original)
311
+ case inQ && hdrSpaceRe.MatchString(line):
312
+ // Any level-two heading ends the question block, as the gate reads it.
313
+ closeBlock()
314
+ inQ = false
315
+ out = append(out, original)
275
316
  case inQ && statusLineRe.MatchString(line):
276
317
  statusSeen = true
277
318
  cur := statusStrip.ReplaceAllString(line, "")
278
- if cur != "open" {
319
+ // Trim and fold case the way the readiness gate does, so a
320
+ // question the gate counts as open is always resolvable.
321
+ if !strings.EqualFold(strings.TrimSpace(cur), "open") {
279
322
  out = append(out, "status: "+cur)
280
323
  inQ = false
281
324
  notOpen = true
@@ -294,7 +337,7 @@ func rewriteQuestionFields(lines []string, target *regexp.Regexp, status, answer
294
337
  out = append(out, "answered_by: human")
295
338
  }
296
339
  default:
297
- out = append(out, line)
340
+ out = append(out, original)
298
341
  }
299
342
  }
300
343
  closeBlock()
@@ -147,7 +147,7 @@ func SecretScan(root string, args []string, stdin io.Reader, stdout, stderr io.W
147
147
  }
148
148
  }
149
149
  if !staged && slug == "" && !readStdin {
150
- changed, err := gitDiffNames(project)
150
+ changed, err := gitChangedAndUntrackedNames(project)
151
151
  if err != nil {
152
152
  fmt.Fprintln(stderr, "secret-scan: cannot inspect changed paths")
153
153
  return 2
@@ -191,6 +191,29 @@ func SecretScan(root string, args []string, stdin io.Reader, stdout, stderr io.W
191
191
  return writeSecretScanResult(findings, stdout, stderr)
192
192
  }
193
193
 
194
+ // gitChangedAndUntrackedNames lists every path that differs from HEAD (staged
195
+ // or not) plus untracked, non-ignored files. On an unborn branch every tracked
196
+ // path is staged, so the index diff stands in for the HEAD diff. Both lists
197
+ // are relative to project, which scanWorktreePaths joins them onto.
198
+ func gitChangedAndUntrackedNames(project string) ([]string, error) {
199
+ changed, err := gitDiffNames(project, "--relative", "HEAD", "--")
200
+ if err != nil {
201
+ if changed, err = gitDiffNames(project, "--relative", "--cached"); err != nil {
202
+ return nil, err
203
+ }
204
+ }
205
+ out, err := runGitCommand(project, nil, "ls-files", "--others", "--exclude-standard", "-z")
206
+ if err != nil {
207
+ return nil, err
208
+ }
209
+ for _, path := range strings.Split(string(out), "\x00") {
210
+ if path != "" {
211
+ changed = append(changed, path)
212
+ }
213
+ }
214
+ return changed, nil
215
+ }
216
+
194
217
  func projectDir(root string) string {
195
218
  if filepath.Base(root) == ".devrites" {
196
219
  return filepath.Dir(root)