safeword 0.78.7 → 0.79.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 (177) hide show
  1. package/codex-plugin/.codex-plugin/plugin.json +1 -1
  2. package/codex-plugin/hooks.json +5 -5
  3. package/codex-plugin/skills/audit/SKILL.md +5 -5
  4. package/codex-plugin/skills/bdd/SKILL.md +1 -1
  5. package/codex-plugin/skills/bdd/references/PLAN_IMPLEMENTATION.md +2 -2
  6. package/codex-plugin/skills/bdd/references/TDD.md +1 -1
  7. package/codex-plugin/skills/explain/SKILL.md +1 -1
  8. package/codex-plugin/skills/quality-review/SKILL.md +2 -2
  9. package/codex-plugin/skills/retro-filer/SKILL.md +2 -2
  10. package/codex-plugin/skills/review-spec/SKILL.md +2 -2
  11. package/codex-plugin/skills/self-review/SKILL.md +1 -1
  12. package/dist/{architecture-HZWCT732.js → architecture-TAPGHONI.js} +4 -4
  13. package/dist/{architecture-document-F4UUBRLN.js → architecture-document-FOKQUJ7K.js} +4 -4
  14. package/dist/{architecture-monorepo-JTKQ334X.js → architecture-monorepo-PIZTZGTG.js} +2 -2
  15. package/dist/{boundary-D3EGHD5C.js → boundary-NTZ5GFPW.js} +4 -4
  16. package/dist/{chunk-53IH5FTG.js → chunk-2UKZKIIY.js} +60 -39
  17. package/dist/chunk-2UKZKIIY.js.map +1 -0
  18. package/dist/chunk-6L3KZFHI.js +903 -0
  19. package/dist/chunk-6L3KZFHI.js.map +1 -0
  20. package/dist/{chunk-REREB3F3.js → chunk-ALOY2A5U.js} +3 -3
  21. package/dist/{chunk-HFWTSV3C.js → chunk-BPJSQGTW.js} +5 -5
  22. package/dist/{chunk-RTFPKJJV.js → chunk-C5CLFFHY.js} +28 -9
  23. package/dist/chunk-C5CLFFHY.js.map +1 -0
  24. package/dist/{chunk-YIMN3JBA.js → chunk-E5RXHYEQ.js} +2 -2
  25. package/dist/{chunk-I6QUGHP4.js → chunk-EJZK25BI.js} +4 -4
  26. package/dist/{chunk-OXEAZ2SO.js → chunk-FBFP7UIQ.js} +5 -5
  27. package/dist/{chunk-C6PKCGYG.js → chunk-JIG23SAN.js} +3 -3
  28. package/dist/{chunk-MVNK7U5P.js → chunk-NEOV7ZY3.js} +1 -2
  29. package/dist/chunk-NEOV7ZY3.js.map +1 -0
  30. package/dist/{chunk-PD7ZXRHV.js → chunk-QJN3F2DH.js} +2 -2
  31. package/dist/{chunk-MNV7IYZI.js → chunk-SGDEKZEO.js} +7 -7
  32. package/dist/{chunk-EWVG6UWA.js → chunk-SRT6XY5C.js} +2 -2
  33. package/dist/{chunk-R6BSRNU4.js → chunk-T6JLA4MC.js} +2 -2
  34. package/dist/{chunk-34YQZWO5.js → chunk-UEQN7FI7.js} +2 -2
  35. package/dist/{chunk-XGB3M6J4.js → chunk-WWXTDCRU.js} +3 -3
  36. package/dist/{chunk-JSR3HXFT.js → chunk-X6JGUZBL.js} +4 -3
  37. package/dist/chunk-X6JGUZBL.js.map +1 -0
  38. package/dist/{chunk-MV4KAM7C.js → chunk-XJIFKUKN.js} +2 -2
  39. package/dist/{chunk-EUINNZUT.js → chunk-YEXD2EZP.js} +2 -2
  40. package/dist/{chunk-EUINNZUT.js.map → chunk-YEXD2EZP.js.map} +1 -1
  41. package/dist/{cleanup-NFU4TLOW.js → cleanup-RAXACWDL.js} +2 -2
  42. package/dist/{cleanup-command-T2AP5AYU.js → cleanup-command-2RVNGDFL.js} +4 -4
  43. package/dist/cli.js +118 -72
  44. package/dist/cli.js.map +1 -1
  45. package/dist/{clients-2MLVXX5D.js → clients-GWNXXDBY.js} +2 -2
  46. package/dist/{codex-bootstrap-KETSXOET.js → codex-bootstrap-URYI6OB4.js} +8 -8
  47. package/dist/{codex-hook-SSGQOIUL.js → codex-hook-MS4U24NV.js} +6 -6
  48. package/dist/{codify-J6SGU2U5.js → codify-Y545VRPC.js} +4 -4
  49. package/dist/{commands-DZDEK2TF.js → commands-5KBSVJ3M.js} +17 -17
  50. package/dist/{config-DDV4JM2U.js → config-K7XFIHDI.js} +2 -2
  51. package/dist/{configured-paths-JIVRWVUT.js → configured-paths-ZPVUVHN2.js} +3 -5
  52. package/dist/{contract-RRWILDE4.js → contract-Z746AM2H.js} +2 -2
  53. package/dist/coordinator-25H4YD5F.js +844 -0
  54. package/dist/coordinator-25H4YD5F.js.map +1 -0
  55. package/dist/corpus-KUDLU6Z7.js +15 -0
  56. package/dist/{doctor-URGPEWKB.js → doctor-HJYA2C2J.js} +10 -10
  57. package/dist/{drain-retro-spool-K6LILQXL.js → drain-retro-spool-2XZGJWSQ.js} +2 -2
  58. package/dist/{drain-retro-spool-K6LILQXL.js.map → drain-retro-spool-2XZGJWSQ.js.map} +1 -1
  59. package/dist/{feature-directories-BXDAPSYF.js → feature-directories-ORGCTDQF.js} +4 -4
  60. package/dist/{finalization-NOXTO236.js → finalization-ZLYBHMWB.js} +2 -2
  61. package/dist/{gh-cli-RMMYG5LT.js → gh-cli-2DO7LVSV.js} +2 -2
  62. package/dist/{github-rest-PVREXJ4D.js → github-rest-MG3CSYUK.js} +2 -2
  63. package/dist/index.js +1 -1
  64. package/dist/{job-5BJDGCLJ.js → job-KJCR3NJV.js} +38 -5
  65. package/dist/job-KJCR3NJV.js.map +1 -0
  66. package/dist/{learning-sync-CYHPL7NE.js → learning-sync-GOD47CGH.js} +3 -3
  67. package/dist/{legacy-global-guidance-7YABLBWO.js → legacy-global-guidance-KHYA62ZB.js} +2 -2
  68. package/dist/{lint-gherkin-LXRAXUNB.js → lint-gherkin-YOG6LBCN.js} +4 -4
  69. package/dist/{namespace-root-LMXTCF3U.js → namespace-root-5G4CGUA5.js} +3 -3
  70. package/dist/{operations-YSOXEY2L.js → operations-5OH4J6JT.js} +8 -8
  71. package/dist/{output-7KI2Y4AG.js → output-2YW4YGKW.js} +2 -2
  72. package/dist/{packet-TOXQSAZI.js → packet-UYZSQV43.js} +2 -2
  73. package/dist/presets/typescript/index.js +1 -1
  74. package/dist/{profile-YTHLD57Q.js → profile-MPKLL53C.js} +3 -3
  75. package/dist/{prompt-CYAC2DNB.js → prompt-2DOHNHVS.js} +2 -2
  76. package/dist/{remove-LT7OUT2W.js → remove-JIWBCH6Y.js} +7 -7
  77. package/dist/{retro-Q3TUH44G.js → retro-EYB23NOL.js} +8 -8
  78. package/dist/{retro-draft-spool-SC4LIHD4.js → retro-draft-spool-AG4RBWGU.js} +2 -2
  79. package/dist/{retro-drain-VDXR7P5P.js → retro-drain-2MM2ZXFA.js} +3 -3
  80. package/dist/{retro-extract-MJASC7A6.js → retro-extract-E37A7XEJ.js} +2 -2
  81. package/dist/{review-knowledge-22LG7REZ.js → review-knowledge-6CIQ732O.js} +2 -2
  82. package/dist/{review-knowledge-22LG7REZ.js.map → review-knowledge-6CIQ732O.js.map} +1 -1
  83. package/dist/{review-pr-KOG44DAD.js → review-pr-62XHNLEQ.js} +75 -28
  84. package/dist/review-pr-62XHNLEQ.js.map +1 -0
  85. package/dist/{review-pr-publication-76J7YOGV.js → review-pr-publication-NKDHKVLB.js} +2 -2
  86. package/dist/{run-GLOA5YBJ.js → run-2HUS2CQT.js} +3 -3
  87. package/dist/{self-report-VJ55TAFD.js → self-report-V5LPS2LJ.js} +2 -2
  88. package/dist/{status-ZONE6Q2N.js → status-CHYSRFOE.js} +10 -10
  89. package/dist/{status-EOULVBDE.js → status-TZK7CKJP.js} +4 -4
  90. package/dist/{sync-config-FISZDWMF.js → sync-config-VGNT5DY7.js} +2 -2
  91. package/dist/{sync-tracker-LJFGIH75.js → sync-tracker-J3KJBPDM.js} +5 -5
  92. package/dist/test-execution-XZNBMWUJ.js +1390 -0
  93. package/dist/test-execution-XZNBMWUJ.js.map +1 -0
  94. package/dist/{test-plan-VWLHPY7B.js → test-plan-NA22OBLU.js} +4 -4
  95. package/dist/{ticket-new-3LV3SJQU.js → ticket-new-GO7BJRLX.js} +3 -3
  96. package/dist/{ticket-sync-UQ23VYAL.js → ticket-sync-GIJX5HLM.js} +4 -4
  97. package/dist/{tracker-map-5ZSM4QU5.js → tracker-map-4Z7LPC5K.js} +2 -2
  98. package/dist/{tracker-sync-OH3VT6RL.js → tracker-sync-IDD23V5G.js} +2 -2
  99. package/package.json +1 -1
  100. package/templates/hooks/lib/blocked-on-gate.ts +2 -2
  101. package/templates/hooks/lib/drain-retro-spool.ts +1 -1
  102. package/templates/hooks/lib/principle-trace.ts +2 -2
  103. package/templates/hooks/lib/project-knowledge.ts +1 -1
  104. package/templates/workflows/pr-review-worker.yml +63 -8
  105. package/templates/workflows/remote-tests.yml +4 -4
  106. package/dist/chunk-53IH5FTG.js.map +0 -1
  107. package/dist/chunk-JSR3HXFT.js.map +0 -1
  108. package/dist/chunk-MVNK7U5P.js.map +0 -1
  109. package/dist/chunk-ORBC7DKD.js +0 -19
  110. package/dist/chunk-ORBC7DKD.js.map +0 -1
  111. package/dist/chunk-RTFPKJJV.js.map +0 -1
  112. package/dist/coordinator-4G6PIWX5.js +0 -1718
  113. package/dist/coordinator-4G6PIWX5.js.map +0 -1
  114. package/dist/corpus-T3USVCRH.js +0 -15
  115. package/dist/job-5BJDGCLJ.js.map +0 -1
  116. package/dist/review-pr-KOG44DAD.js.map +0 -1
  117. package/dist/test-execution-BKSDVBWE.js +0 -342
  118. package/dist/test-execution-BKSDVBWE.js.map +0 -1
  119. /package/dist/{architecture-HZWCT732.js.map → architecture-TAPGHONI.js.map} +0 -0
  120. /package/dist/{architecture-document-F4UUBRLN.js.map → architecture-document-FOKQUJ7K.js.map} +0 -0
  121. /package/dist/{architecture-monorepo-JTKQ334X.js.map → architecture-monorepo-PIZTZGTG.js.map} +0 -0
  122. /package/dist/{boundary-D3EGHD5C.js.map → boundary-NTZ5GFPW.js.map} +0 -0
  123. /package/dist/{chunk-REREB3F3.js.map → chunk-ALOY2A5U.js.map} +0 -0
  124. /package/dist/{chunk-HFWTSV3C.js.map → chunk-BPJSQGTW.js.map} +0 -0
  125. /package/dist/{chunk-YIMN3JBA.js.map → chunk-E5RXHYEQ.js.map} +0 -0
  126. /package/dist/{chunk-I6QUGHP4.js.map → chunk-EJZK25BI.js.map} +0 -0
  127. /package/dist/{chunk-OXEAZ2SO.js.map → chunk-FBFP7UIQ.js.map} +0 -0
  128. /package/dist/{chunk-C6PKCGYG.js.map → chunk-JIG23SAN.js.map} +0 -0
  129. /package/dist/{chunk-PD7ZXRHV.js.map → chunk-QJN3F2DH.js.map} +0 -0
  130. /package/dist/{chunk-MNV7IYZI.js.map → chunk-SGDEKZEO.js.map} +0 -0
  131. /package/dist/{chunk-EWVG6UWA.js.map → chunk-SRT6XY5C.js.map} +0 -0
  132. /package/dist/{chunk-R6BSRNU4.js.map → chunk-T6JLA4MC.js.map} +0 -0
  133. /package/dist/{chunk-34YQZWO5.js.map → chunk-UEQN7FI7.js.map} +0 -0
  134. /package/dist/{chunk-XGB3M6J4.js.map → chunk-WWXTDCRU.js.map} +0 -0
  135. /package/dist/{chunk-MV4KAM7C.js.map → chunk-XJIFKUKN.js.map} +0 -0
  136. /package/dist/{cleanup-NFU4TLOW.js.map → cleanup-RAXACWDL.js.map} +0 -0
  137. /package/dist/{cleanup-command-T2AP5AYU.js.map → cleanup-command-2RVNGDFL.js.map} +0 -0
  138. /package/dist/{clients-2MLVXX5D.js.map → clients-GWNXXDBY.js.map} +0 -0
  139. /package/dist/{codex-bootstrap-KETSXOET.js.map → codex-bootstrap-URYI6OB4.js.map} +0 -0
  140. /package/dist/{codex-hook-SSGQOIUL.js.map → codex-hook-MS4U24NV.js.map} +0 -0
  141. /package/dist/{codify-J6SGU2U5.js.map → codify-Y545VRPC.js.map} +0 -0
  142. /package/dist/{commands-DZDEK2TF.js.map → commands-5KBSVJ3M.js.map} +0 -0
  143. /package/dist/{config-DDV4JM2U.js.map → config-K7XFIHDI.js.map} +0 -0
  144. /package/dist/{configured-paths-JIVRWVUT.js.map → configured-paths-ZPVUVHN2.js.map} +0 -0
  145. /package/dist/{contract-RRWILDE4.js.map → contract-Z746AM2H.js.map} +0 -0
  146. /package/dist/{corpus-T3USVCRH.js.map → corpus-KUDLU6Z7.js.map} +0 -0
  147. /package/dist/{doctor-URGPEWKB.js.map → doctor-HJYA2C2J.js.map} +0 -0
  148. /package/dist/{feature-directories-BXDAPSYF.js.map → feature-directories-ORGCTDQF.js.map} +0 -0
  149. /package/dist/{finalization-NOXTO236.js.map → finalization-ZLYBHMWB.js.map} +0 -0
  150. /package/dist/{gh-cli-RMMYG5LT.js.map → gh-cli-2DO7LVSV.js.map} +0 -0
  151. /package/dist/{github-rest-PVREXJ4D.js.map → github-rest-MG3CSYUK.js.map} +0 -0
  152. /package/dist/{learning-sync-CYHPL7NE.js.map → learning-sync-GOD47CGH.js.map} +0 -0
  153. /package/dist/{legacy-global-guidance-7YABLBWO.js.map → legacy-global-guidance-KHYA62ZB.js.map} +0 -0
  154. /package/dist/{lint-gherkin-LXRAXUNB.js.map → lint-gherkin-YOG6LBCN.js.map} +0 -0
  155. /package/dist/{namespace-root-LMXTCF3U.js.map → namespace-root-5G4CGUA5.js.map} +0 -0
  156. /package/dist/{operations-YSOXEY2L.js.map → operations-5OH4J6JT.js.map} +0 -0
  157. /package/dist/{output-7KI2Y4AG.js.map → output-2YW4YGKW.js.map} +0 -0
  158. /package/dist/{packet-TOXQSAZI.js.map → packet-UYZSQV43.js.map} +0 -0
  159. /package/dist/{profile-YTHLD57Q.js.map → profile-MPKLL53C.js.map} +0 -0
  160. /package/dist/{prompt-CYAC2DNB.js.map → prompt-2DOHNHVS.js.map} +0 -0
  161. /package/dist/{remove-LT7OUT2W.js.map → remove-JIWBCH6Y.js.map} +0 -0
  162. /package/dist/{retro-Q3TUH44G.js.map → retro-EYB23NOL.js.map} +0 -0
  163. /package/dist/{retro-draft-spool-SC4LIHD4.js.map → retro-draft-spool-AG4RBWGU.js.map} +0 -0
  164. /package/dist/{retro-drain-VDXR7P5P.js.map → retro-drain-2MM2ZXFA.js.map} +0 -0
  165. /package/dist/{retro-extract-MJASC7A6.js.map → retro-extract-E37A7XEJ.js.map} +0 -0
  166. /package/dist/{review-pr-publication-76J7YOGV.js.map → review-pr-publication-NKDHKVLB.js.map} +0 -0
  167. /package/dist/{run-GLOA5YBJ.js.map → run-2HUS2CQT.js.map} +0 -0
  168. /package/dist/{self-report-VJ55TAFD.js.map → self-report-V5LPS2LJ.js.map} +0 -0
  169. /package/dist/{status-EOULVBDE.js.map → status-CHYSRFOE.js.map} +0 -0
  170. /package/dist/{status-ZONE6Q2N.js.map → status-TZK7CKJP.js.map} +0 -0
  171. /package/dist/{sync-config-FISZDWMF.js.map → sync-config-VGNT5DY7.js.map} +0 -0
  172. /package/dist/{sync-tracker-LJFGIH75.js.map → sync-tracker-J3KJBPDM.js.map} +0 -0
  173. /package/dist/{test-plan-VWLHPY7B.js.map → test-plan-NA22OBLU.js.map} +0 -0
  174. /package/dist/{ticket-new-3LV3SJQU.js.map → ticket-new-GO7BJRLX.js.map} +0 -0
  175. /package/dist/{ticket-sync-UQ23VYAL.js.map → ticket-sync-GIJX5HLM.js.map} +0 -0
  176. /package/dist/{tracker-map-5ZSM4QU5.js.map → tracker-map-4Z7LPC5K.js.map} +0 -0
  177. /package/dist/{tracker-sync-OH3VT6RL.js.map → tracker-sync-IDD23V5G.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "safeword",
3
- "version": "0.78.7",
3
+ "version": "0.79.0",
4
4
  "description": "Safeword workflow guidance and gates for Codex.",
5
5
  "author": {
6
6
  "name": "Arcade AI"
@@ -6,7 +6,7 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "bunx --bun safeword@0.78.7 hook codex session-start --plugin-hook",
9
+ "command": "bunx --bun safeword@0.79.0 hook codex session-start --plugin-hook",
10
10
  "timeout": 120,
11
11
  "statusMessage": "Loading Safeword standing instructions"
12
12
  }
@@ -19,7 +19,7 @@
19
19
  "hooks": [
20
20
  {
21
21
  "type": "command",
22
- "command": "bunx --bun safeword@0.78.7 hook codex pre-tool-use --plugin-hook",
22
+ "command": "bunx --bun safeword@0.79.0 hook codex pre-tool-use --plugin-hook",
23
23
  "timeout": 30,
24
24
  "statusMessage": "Checking Safeword edit gates"
25
25
  }
@@ -32,7 +32,7 @@
32
32
  "hooks": [
33
33
  {
34
34
  "type": "command",
35
- "command": "bunx --bun safeword@0.78.7 hook codex post-tool-use --plugin-hook",
35
+ "command": "bunx --bun safeword@0.79.0 hook codex post-tool-use --plugin-hook",
36
36
  "timeout": 30,
37
37
  "statusMessage": "Surfacing Safeword post-tool context"
38
38
  }
@@ -45,7 +45,7 @@
45
45
  "hooks": [
46
46
  {
47
47
  "type": "command",
48
- "command": "bunx --bun safeword@0.78.7 hook codex user-prompt-submit --plugin-hook",
48
+ "command": "bunx --bun safeword@0.79.0 hook codex user-prompt-submit --plugin-hook",
49
49
  "timeout": 30,
50
50
  "statusMessage": "Checking queued Safeword prompt context"
51
51
  }
@@ -58,7 +58,7 @@
58
58
  "hooks": [
59
59
  {
60
60
  "type": "command",
61
- "command": "bunx --bun safeword@0.78.7 hook codex stop --plugin-hook",
61
+ "command": "bunx --bun safeword@0.79.0 hook codex stop --plugin-hook",
62
62
  "timeout": 600,
63
63
  "statusMessage": "Checking Safeword stop continuation"
64
64
  }
@@ -557,7 +557,7 @@ Changed project learnings in the resolved namespace root's `learnings/*.md` must
557
557
  PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2> /dev/null || pwd)}"
558
558
  source "$PROJECT_DIR/.safeword/hooks/lib/audit-scope.sh"
559
559
  audit_scope_initialize "$PROJECT_DIR"
560
- NS_ROOT="$(bunx --bun safeword@0.78.7 project namespace-root --cwd "$PROJECT_DIR")"
560
+ NS_ROOT="$(bunx --bun safeword@0.79.0 project namespace-root --cwd "$PROJECT_DIR")"
561
561
 
562
562
  learning_is_in_audit_scope() {
563
563
  [ "$AUDIT_SCOPE_MODE" = "repository" ] && return 0
@@ -717,13 +717,13 @@ audit_scope_initialize "$PROJECT_DIR"
717
717
 
718
718
  # Resolve the namespace root (honors config paths.projectRoot in real runs).
719
719
  # Fall back on directory existence — robust when the resolver hook is absent.
720
- NS_ROOT="$(bunx --bun safeword@0.78.7 project namespace-root --cwd "$PROJECT_DIR" 2> /dev/null)"
720
+ NS_ROOT="$(bunx --bun safeword@0.79.0 project namespace-root --cwd "$PROJECT_DIR" 2> /dev/null)"
721
721
  [ -d "$NS_ROOT" ] || {
722
722
  if [ -d "$PROJECT_DIR/.project" ]; then NS_ROOT="$PROJECT_DIR/.project"; else NS_ROOT="$PROJECT_DIR/.safeword-project"; fi
723
723
  }
724
- PERSONAS_FILE="$(bunx --bun safeword@0.78.7 project namespace-root --cwd "$PROJECT_DIR" --key personas 2> /dev/null)"
725
- SURFACES_FILE="$(bunx --bun safeword@0.78.7 project namespace-root --cwd "$PROJECT_DIR" --key surfaces 2> /dev/null)"
726
- GLOSSARY_FILE="$(bunx --bun safeword@0.78.7 project namespace-root --cwd "$PROJECT_DIR" --key glossary 2> /dev/null)"
724
+ PERSONAS_FILE="$(bunx --bun safeword@0.79.0 project namespace-root --cwd "$PROJECT_DIR" --key personas 2> /dev/null)"
725
+ SURFACES_FILE="$(bunx --bun safeword@0.79.0 project namespace-root --cwd "$PROJECT_DIR" --key surfaces 2> /dev/null)"
726
+ GLOSSARY_FILE="$(bunx --bun safeword@0.79.0 project namespace-root --cwd "$PROJECT_DIR" --key glossary 2> /dev/null)"
727
727
  [ -n "$PERSONAS_FILE" ] || PERSONAS_FILE="$NS_ROOT/personas.md"
728
728
  [ -n "$SURFACES_FILE" ] || SURFACES_FILE="$NS_ROOT/surfaces.md"
729
729
  [ -n "$GLOSSARY_FILE" ] || GLOSSARY_FILE="$NS_ROOT/glossary.md"
@@ -53,7 +53,7 @@ and ticket scope; its typed verdict decides. Resolve a review-capable Safeword
53
53
  CLI first; source checkouts do not guarantee a bare `safeword` on `PATH`:
54
54
 
55
55
  ```bash
56
- SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.78.7 review run scenario-gate feature-file ticket-spec [legacy-test-definitions] --agent-handoff --json
56
+ SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.79.0 review run scenario-gate feature-file ticket-spec [legacy-test-definitions] --agent-handoff --json
57
57
  ```
58
58
 
59
59
  The coordinator prefers the opposite headless agent and labels a permitted
@@ -82,10 +82,10 @@ Scaffold from `.safeword/templates/impl-plan-template.md` (sibling to `ticket.md
82
82
 
83
83
  ## Exit: review, then (optionally) the user
84
84
 
85
- 1. **Independent review first.** At review time, run `bunx --bun safeword@0.78.7 project review-knowledge --json`. Resolve a review-capable Safeword CLI, then invoke the coordinator with the current files identified by the resolver:
85
+ 1. **Independent review first.** At review time, run `bunx --bun safeword@0.79.0 project review-knowledge --json`. Resolve a review-capable Safeword CLI, then invoke the coordinator with the current files identified by the resolver:
86
86
 
87
87
  ```bash
88
- SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.78.7 review run plan-implementation impl-plan.md spec.md ticket.md feature-file principles-file personas-file surfaces-file --agent-handoff --json
88
+ SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.79.0 review run plan-implementation impl-plan.md spec.md ticket.md feature-file principles-file personas-file surfaces-file --agent-handoff --json
89
89
  ```
90
90
 
91
91
  The shared coordinator sends that bounded packet to the opposite headless agent when available; its typed verdict, failure classification, and independence level are authoritative. Only when that typed result is `REVIEW_ROUTES_EXHAUSTED`, invoke `$safeword:finish-review` immediately with the original result and the same accepted targets; return every other result unchanged and do not substitute another private subagent. Give the reviewer the current `spec.md`, configured principles file, configured personas file, and configured surfaces file in that packet. The reviewer refutes the plan: challenge whether it selected the actually applicable principles, whether each concrete consequence follows from its principle, whether the proposed proof can prove that consequence, whether conflicts belong in Known deviations, whether the design fulfills each persona's JTBD, and whether any affected surface was omitted or lacks credible proof. Also check wrong-direction design, missed scenarios, and editorial padding via the deletion test. Fix findings, re-resolve the sources, re-review, then stamp the exit with the returned agent provenance (`write-review-stamp.ts --author-agent "author-agent" --reviewer-agent "actual-reviewer" --independence "independence" --phase plan-implementation`, where the review gate is enabled). Add `--model` only when the executed reviewer reports a verifiable model identifier; the coordinator never invents one. Human handoff happens **only after** this review passes — raw planning output is never presented for approval. Exception, any time: information only the user has (intent, priorities, constraints not in code or docs) routes to the user the moment the gap appears — `$safeword:elicit`.
@@ -196,7 +196,7 @@ Off by default. When `.safeword/config.json` sets `architectureReviewGate: true`
196
196
  2. **A fresh-context review.** Resolve a review-capable Safeword CLI, then run the shared coordinator with only the bounded design evidence:
197
197
 
198
198
  ```bash
199
- SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.78.7 review run plan-implementation impl-plan.md ticket-spec feature-file --agent-handoff --json
199
+ SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.79.0 review run plan-implementation impl-plan.md ticket-spec feature-file --agent-handoff --json
200
200
  ```
201
201
 
202
202
  The shared coordinator prefers the opposite headless agent. Only when its typed result is `REVIEW_ROUTES_EXHAUSTED`, invoke `$safeword:finish-review` with the original result and the same accepted targets; return every other result unchanged. Degraded findings cannot satisfy a required independent-review gate. On an independent pass, stamp it:
@@ -39,7 +39,7 @@ Gather the durable trail safeword already keeps, then narrate it. Run:
39
39
 
40
40
  ```bash
41
41
  PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2> /dev/null || pwd)}"
42
- NS_ROOT="$(bunx --bun safeword@0.78.7 project namespace-root --cwd "$PROJECT_DIR")"
42
+ NS_ROOT="$(bunx --bun safeword@0.79.0 project namespace-root --cwd "$PROJECT_DIR")"
43
43
  # What you're on now: the last re-entry line names the current ticket + Next
44
44
  tail -3 "$NS_ROOT/re-entry.md" 2> /dev/null
45
45
  # Fallback when re-entry is empty: in_progress tickets (not epics)
@@ -50,7 +50,7 @@ If in a BDD workflow, read the current ticket from `<namespace-root>/tickets/` a
50
50
 
51
51
  ### Project-principle challenge
52
52
 
53
- For a BDD ticket, run `bunx --bun safeword@0.78.7 project review-knowledge --json` at the
53
+ For a BDD ticket, run `bunx --bun safeword@0.79.0 project review-knowledge --json` at the
54
54
  start of each pass and read the current `principles`, `personas`, and `surfaces`
55
55
  paths and content it returns (including overrides such as `paths.principles`).
56
56
  Do not substitute labels or intake-era content.
@@ -175,7 +175,7 @@ Each pass:
175
175
  CLI first; source checkouts do not guarantee a bare `safeword` on `PATH`:
176
176
 
177
177
  ```bash
178
- SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.78.7 review run quality-review changed-file [more-changed-files...] --agent-handoff --json
178
+ SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.79.0 review run quality-review changed-file [more-changed-files...] --agent-handoff --json
179
179
  ```
180
180
 
181
181
  A healthy deep review may return `REVIEW_PENDING` after its foreground
@@ -17,7 +17,7 @@ a caller-nominated path. The spool contains sanitized safeword findings for
17
17
  ## Procedure
18
18
 
19
19
  1. Before reading or making any tracker call, run
20
- `bunx --bun safeword@0.78.7 project retro-drain "<spool-path>" --validated-jsonl`.
20
+ `bunx --bun safeword@0.79.0 project retro-drain "<spool-path>" --validated-jsonl`.
21
21
  Use only its JSONL stdout as the filing input. A nonzero exit means validation
22
22
  failed: make no search, comment, or create call, leave the spool unchanged,
23
23
  and report `retro-filer: cannot file - draft validation failed`. If its output
@@ -60,7 +60,7 @@ a caller-nominated path. The spool contains sanitized safeword findings for
60
60
  the draft only when the append succeeded and the exact ack is visible. If the
61
61
  append or verification fails, leave the draft in place.
62
62
  5. Create at most five new issues per run. Drain only by running
63
- `bunx --bun safeword@0.78.7 project retro-drain "<spool-path>"`; never rewrite or
63
+ `bunx --bun safeword@0.79.0 project retro-drain "<spool-path>"`; never rewrite or
64
64
  delete the spool directly. The helper removes only drafts whose valid ack is
65
65
  reader-visible, so unfiled or unacknowledged drafts remain. If tracker write
66
66
  access is unavailable, leave the spool unchanged and report
@@ -16,7 +16,7 @@ Adversarially review a ticket's scenarios: treat them as if you're trying to bre
16
16
  - **Manual re-run** — invoke `$safeword:review-spec` anytime after `define-behavior` (e.g., scenarios changed during implement and you want to re-validate). Allowed on a closed ticket too — a post-hoc audit is still readable.
17
17
 
18
18
  Read the active ticket's `.feature` source first. At review time, run
19
- `bunx --bun safeword@0.78.7 project review-knowledge --json` and read the current
19
+ `bunx --bun safeword@0.79.0 project review-knowledge --json` and read the current
20
20
  `principles`, `personas`, and `surfaces` source paths and content it returns, so
21
21
  the review is grounded in project knowledge rather than labels or stale intake
22
22
  context. The resolver honors `paths.principles`, `paths.personas`, and
@@ -35,7 +35,7 @@ Resolve a review-capable Safeword CLI first; source checkouts do not guarantee
35
35
  a bare `safeword` on `PATH`:
36
36
 
37
37
  ```bash
38
- SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.78.7 review run scenario-gate feature-file ticket-spec [legacy-test-definitions] --agent-handoff --json
38
+ SAFEWORD_REVIEW_PROGRESS=1 bunx --bun safeword@0.79.0 review run scenario-gate feature-file ticket-spec [legacy-test-definitions] --agent-handoff --json
39
39
  ```
40
40
 
41
41
  The coordinator's assigned/actual reviewer, failure classification, and
@@ -45,7 +45,7 @@ installed helper — report it to the user and resolve before retrying.
45
45
  ## Review the spec (do this now, with the stamp written)
46
46
 
47
47
  The stamp records that a review was invoked; the actual scrutiny is yours. At
48
- review time, run `bunx --bun safeword@0.78.7 project review-knowledge --json` and use its
48
+ review time, run `bunx --bun safeword@0.79.0 project review-knowledge --json` and use its
49
49
  current `principles`, `personas`, and `surfaces` source paths and content—not
50
50
  labels remembered from intake. These resolve from `paths.principles`,
51
51
  `paths.personas`, and `paths.surfaces` when configured. Read those sources with the active ticket's
@@ -9,14 +9,14 @@ import {
9
9
  planSelfHealProject,
10
10
  selfHealProject,
11
11
  selfHealProjectPreservingProse
12
- } from "./chunk-MV4KAM7C.js";
12
+ } from "./chunk-XJIFKUKN.js";
13
13
  import {
14
14
  GENERATED_ARCHITECTURE_FILENAME,
15
15
  isArchitectureDocumentEnforcementEnabled,
16
16
  readConfiguredPath,
17
17
  resolveGeneratedArchitecturePath,
18
18
  toRepoDirectory
19
- } from "./chunk-MVNK7U5P.js";
19
+ } from "./chunk-NEOV7ZY3.js";
20
20
  import {
21
21
  discoverUnreadableWorkspaces,
22
22
  extractMonorepoArchitectureSnapshot
@@ -25,7 +25,7 @@ import {
25
25
  readJson,
26
26
  writeJson
27
27
  } from "./chunk-HF3DXZEA.js";
28
- import "./chunk-EUINNZUT.js";
28
+ import "./chunk-YEXD2EZP.js";
29
29
 
30
30
  // src/commands/architecture.ts
31
31
  import { execFileSync } from "child_process";
@@ -650,4 +650,4 @@ export {
650
650
  architectureStage,
651
651
  architectureStaged
652
652
  };
653
- //# sourceMappingURL=architecture-HZWCT732.js.map
653
+ //# sourceMappingURL=architecture-TAPGHONI.js.map
@@ -7,11 +7,11 @@ import {
7
7
  selfHeal,
8
8
  selfHealProject,
9
9
  selfHealProjectPreservingProse
10
- } from "./chunk-MV4KAM7C.js";
11
- import "./chunk-MVNK7U5P.js";
10
+ } from "./chunk-XJIFKUKN.js";
11
+ import "./chunk-NEOV7ZY3.js";
12
12
  import "./chunk-VZ5B2SIO.js";
13
13
  import "./chunk-HF3DXZEA.js";
14
- import "./chunk-EUINNZUT.js";
14
+ import "./chunk-YEXD2EZP.js";
15
15
  export {
16
16
  isSafewordOwned,
17
17
  isWouldChangeAction,
@@ -22,4 +22,4 @@ export {
22
22
  selfHealProject,
23
23
  selfHealProjectPreservingProse
24
24
  };
25
- //# sourceMappingURL=architecture-document-F4UUBRLN.js.map
25
+ //# sourceMappingURL=architecture-document-FOKQUJ7K.js.map
@@ -5,11 +5,11 @@ import {
5
5
  monorepoFingerprintOf
6
6
  } from "./chunk-VZ5B2SIO.js";
7
7
  import "./chunk-HF3DXZEA.js";
8
- import "./chunk-EUINNZUT.js";
8
+ import "./chunk-YEXD2EZP.js";
9
9
  export {
10
10
  discoverUnreadableWorkspaces,
11
11
  discoverWorkspaces,
12
12
  extractMonorepoArchitectureSnapshot,
13
13
  monorepoFingerprintOf
14
14
  };
15
- //# sourceMappingURL=architecture-monorepo-JTKQ334X.js.map
15
+ //# sourceMappingURL=architecture-monorepo-PIZTZGTG.js.map
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-Z4ESH6KU.js";
15
15
  import {
16
16
  createPhaseAnchorScope
17
- } from "./chunk-34YQZWO5.js";
17
+ } from "./chunk-UEQN7FI7.js";
18
18
  import "./chunk-OKPRQGFG.js";
19
19
  import {
20
20
  warn
@@ -22,11 +22,11 @@ import {
22
22
  import {
23
23
  readConfiguredPathFromContent,
24
24
  ticketDirectoriesForConfiguredRoot
25
- } from "./chunk-MVNK7U5P.js";
25
+ } from "./chunk-NEOV7ZY3.js";
26
26
  import {
27
27
  readFileSafe
28
28
  } from "./chunk-HF3DXZEA.js";
29
- import "./chunk-EUINNZUT.js";
29
+ import "./chunk-YEXD2EZP.js";
30
30
 
31
31
  // src/commands/boundary.ts
32
32
  import { execFileSync as execFileSync2 } from "child_process";
@@ -627,4 +627,4 @@ function boundary(options) {
627
627
  export {
628
628
  boundary
629
629
  };
630
- //# sourceMappingURL=boundary-D3EGHD5C.js.map
630
+ //# sourceMappingURL=boundary-NTZ5GFPW.js.map
@@ -3,7 +3,7 @@ import {
3
3
  detectPythonLayers,
4
4
  detectRootPackage,
5
5
  detectSolePackage
6
- } from "./chunk-JSR3HXFT.js";
6
+ } from "./chunk-X6JGUZBL.js";
7
7
  import {
8
8
  CODEX_MIGRATION_SCHEMA
9
9
  } from "./chunk-AVAUUIDB.js";
@@ -26,7 +26,7 @@ import {
26
26
  } from "./chunk-QSLVO4XF.js";
27
27
  import {
28
28
  resolveNamespaceRoot
29
- } from "./chunk-MVNK7U5P.js";
29
+ } from "./chunk-NEOV7ZY3.js";
30
30
  import {
31
31
  exists,
32
32
  findInTree,
@@ -1759,6 +1759,7 @@ var NAMESPACE_TRANSIENT_BASENAMES = [
1759
1759
  ];
1760
1760
  var SAFEWORD_TRANSIENT_PATHS = [
1761
1761
  ".safeword/.update-cache.json",
1762
+ ".safeword/config.local.json",
1762
1763
  ".safeword/retro-drafts/",
1763
1764
  ".safeword/self-reports/",
1764
1765
  ".safeword/boundary-audit.jsonl",
@@ -2866,6 +2867,60 @@ ${durableNamespaceDirectories(
2866
2867
  // NPM packages to install (JS/TS specific packages from typescript pack)
2867
2868
  packages: typescriptPackages
2868
2869
  };
2870
+ var ALL_SCHEMA_PATH_COLLECTIONS = [
2871
+ "ownedDirs",
2872
+ "sharedDirs",
2873
+ "preservedDirs",
2874
+ "deprecatedFiles",
2875
+ "deprecatedDirs",
2876
+ "ownedFiles",
2877
+ "managedFiles",
2878
+ "jsonMerges",
2879
+ "textPatches",
2880
+ "legacyTextPatches",
2881
+ "contracts"
2882
+ ];
2883
+ function filterPathEntries(values, keepPath) {
2884
+ return Object.fromEntries(Object.entries(values).filter(([path]) => keepPath(path)));
2885
+ }
2886
+ function filterSelectedPathList(collections, collection, values, keepPath) {
2887
+ return collections.has(collection) ? values.filter((path) => keepPath(path)) : values;
2888
+ }
2889
+ function filterSelectedPathEntries(collections, collection, values, keepPath) {
2890
+ return collections.has(collection) ? filterPathEntries(values, keepPath) : values;
2891
+ }
2892
+ function filterSchemaPaths(schema, keepPath, collections = ALL_SCHEMA_PATH_COLLECTIONS) {
2893
+ const filters = new Set(collections);
2894
+ return {
2895
+ ...schema,
2896
+ ownedDirs: filterSelectedPathList(filters, "ownedDirs", schema.ownedDirs, keepPath),
2897
+ sharedDirs: filterSelectedPathList(filters, "sharedDirs", schema.sharedDirs, keepPath),
2898
+ preservedDirs: filterSelectedPathList(filters, "preservedDirs", schema.preservedDirs, keepPath),
2899
+ deprecatedFiles: filterSelectedPathList(
2900
+ filters,
2901
+ "deprecatedFiles",
2902
+ schema.deprecatedFiles,
2903
+ keepPath
2904
+ ),
2905
+ deprecatedDirs: filterSelectedPathList(
2906
+ filters,
2907
+ "deprecatedDirs",
2908
+ schema.deprecatedDirs,
2909
+ keepPath
2910
+ ),
2911
+ ownedFiles: filterSelectedPathEntries(filters, "ownedFiles", schema.ownedFiles, keepPath),
2912
+ managedFiles: filterSelectedPathEntries(filters, "managedFiles", schema.managedFiles, keepPath),
2913
+ jsonMerges: filterSelectedPathEntries(filters, "jsonMerges", schema.jsonMerges, keepPath),
2914
+ textPatches: filterSelectedPathEntries(filters, "textPatches", schema.textPatches, keepPath),
2915
+ legacyTextPatches: filterSelectedPathEntries(
2916
+ filters,
2917
+ "legacyTextPatches",
2918
+ schema.legacyTextPatches,
2919
+ keepPath
2920
+ ),
2921
+ contracts: filterSelectedPathEntries(filters, "contracts", schema.contracts, keepPath)
2922
+ };
2923
+ }
2869
2924
  var CURSOR_PROJECT_PATHS = /* @__PURE__ */ new Set([
2870
2925
  ".safeword/hooks/lib/cursor-state.ts",
2871
2926
  ".safeword/hooks/session-cursor-auto-upgrade.ts"
@@ -2873,25 +2928,9 @@ var CURSOR_PROJECT_PATHS = /* @__PURE__ */ new Set([
2873
2928
  function isCursorProjectPath(path) {
2874
2929
  return path === ".cursor" || path.startsWith(".cursor/") || path === ".safeword/hooks/cursor" || path.startsWith(".safeword/hooks/cursor/") || CURSOR_PROJECT_PATHS.has(path);
2875
2930
  }
2876
- function withoutCursorEntries(values) {
2877
- return Object.fromEntries(Object.entries(values).filter(([path]) => !isCursorProjectPath(path)));
2878
- }
2879
2931
  function schemaForProjectSurfaces(schema, surfaces) {
2880
2932
  if (surfaces.includes("cursor")) return schema;
2881
- return {
2882
- ...schema,
2883
- ownedDirs: schema.ownedDirs.filter((path) => !isCursorProjectPath(path)),
2884
- sharedDirs: schema.sharedDirs.filter((path) => !isCursorProjectPath(path)),
2885
- preservedDirs: schema.preservedDirs.filter((path) => !isCursorProjectPath(path)),
2886
- deprecatedFiles: schema.deprecatedFiles.filter((path) => !isCursorProjectPath(path)),
2887
- deprecatedDirs: schema.deprecatedDirs.filter((path) => !isCursorProjectPath(path)),
2888
- ownedFiles: withoutCursorEntries(schema.ownedFiles),
2889
- managedFiles: withoutCursorEntries(schema.managedFiles),
2890
- jsonMerges: withoutCursorEntries(schema.jsonMerges),
2891
- textPatches: withoutCursorEntries(schema.textPatches),
2892
- legacyTextPatches: withoutCursorEntries(schema.legacyTextPatches),
2893
- contracts: withoutCursorEntries(schema.contracts)
2894
- };
2933
+ return filterSchemaPaths(schema, (path) => !isCursorProjectPath(path));
2895
2934
  }
2896
2935
  var SHARED_AGENT_RUNTIME_ROOTS = [
2897
2936
  ".safeword/hooks",
@@ -2906,27 +2945,9 @@ var SHARED_AGENT_RUNTIME_ROOTS = [
2906
2945
  function isSharedAgentRuntimePath(path) {
2907
2946
  return SHARED_AGENT_RUNTIME_ROOTS.some((root) => path === root || path.startsWith(`${root}/`));
2908
2947
  }
2909
- function withoutSharedAgentRuntimeEntries(values) {
2910
- return Object.fromEntries(
2911
- Object.entries(values).filter(([path]) => !isSharedAgentRuntimePath(path))
2912
- );
2913
- }
2914
2948
  function schemaForSharedAgentRuntime(schema, needed) {
2915
2949
  if (needed) return schema;
2916
- return {
2917
- ...schema,
2918
- ownedDirs: schema.ownedDirs.filter((path) => !isSharedAgentRuntimePath(path)),
2919
- sharedDirs: schema.sharedDirs.filter((path) => !isSharedAgentRuntimePath(path)),
2920
- preservedDirs: schema.preservedDirs.filter((path) => !isSharedAgentRuntimePath(path)),
2921
- deprecatedFiles: schema.deprecatedFiles.filter((path) => !isSharedAgentRuntimePath(path)),
2922
- deprecatedDirs: schema.deprecatedDirs.filter((path) => !isSharedAgentRuntimePath(path)),
2923
- ownedFiles: withoutSharedAgentRuntimeEntries(schema.ownedFiles),
2924
- managedFiles: withoutSharedAgentRuntimeEntries(schema.managedFiles),
2925
- jsonMerges: withoutSharedAgentRuntimeEntries(schema.jsonMerges),
2926
- textPatches: withoutSharedAgentRuntimeEntries(schema.textPatches),
2927
- legacyTextPatches: withoutSharedAgentRuntimeEntries(schema.legacyTextPatches),
2928
- contracts: withoutSharedAgentRuntimeEntries(schema.contracts)
2929
- };
2950
+ return filterSchemaPaths(schema, (path) => !isSharedAgentRuntimePath(path));
2930
2951
  }
2931
2952
 
2932
2953
  export {
@@ -2941,4 +2962,4 @@ export {
2941
2962
  schemaForProjectSurfaces,
2942
2963
  schemaForSharedAgentRuntime
2943
2964
  };
2944
- //# sourceMappingURL=chunk-53IH5FTG.js.map
2965
+ //# sourceMappingURL=chunk-2UKZKIIY.js.map