@cluesmith/codev 3.3.1 → 3.3.2

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 (118) hide show
  1. package/dashboard-dist/assets/index-D3XaKpZW.js.map +1 -1
  2. package/dist/agent-farm/cli.d.ts.map +1 -1
  3. package/dist/agent-farm/cli.js +52 -1
  4. package/dist/agent-farm/cli.js.map +1 -1
  5. package/dist/agent-farm/commands/reset/constants.d.ts +118 -0
  6. package/dist/agent-farm/commands/reset/constants.d.ts.map +1 -1
  7. package/dist/agent-farm/commands/reset/constants.js +118 -0
  8. package/dist/agent-farm/commands/reset/constants.js.map +1 -1
  9. package/dist/agent-farm/commands/reset/context.d.ts +18 -0
  10. package/dist/agent-farm/commands/reset/context.d.ts.map +1 -1
  11. package/dist/agent-farm/commands/reset/context.js +41 -0
  12. package/dist/agent-farm/commands/reset/context.js.map +1 -1
  13. package/dist/agent-farm/commands/reset/receipt.d.ts.map +1 -1
  14. package/dist/agent-farm/commands/reset/receipt.js +16 -5
  15. package/dist/agent-farm/commands/reset/receipt.js.map +1 -1
  16. package/dist/agent-farm/commands/reset/reorient.d.ts +1 -1
  17. package/dist/agent-farm/commands/reset/reorient.d.ts.map +1 -1
  18. package/dist/agent-farm/commands/reset/reorient.js +8 -1
  19. package/dist/agent-farm/commands/reset/reorient.js.map +1 -1
  20. package/dist/agent-farm/commands/reset/self.d.ts +335 -0
  21. package/dist/agent-farm/commands/reset/self.d.ts.map +1 -0
  22. package/dist/agent-farm/commands/reset/self.js +636 -0
  23. package/dist/agent-farm/commands/reset/self.js.map +1 -0
  24. package/dist/agent-farm/commands/reset.d.ts.map +1 -1
  25. package/dist/agent-farm/commands/reset.js +23 -18
  26. package/dist/agent-farm/commands/reset.js.map +1 -1
  27. package/dist/agent-farm/commands/self-refresh.d.ts +60 -0
  28. package/dist/agent-farm/commands/self-refresh.d.ts.map +1 -0
  29. package/dist/agent-farm/commands/self-refresh.js +506 -0
  30. package/dist/agent-farm/commands/self-refresh.js.map +1 -0
  31. package/dist/agent-farm/commands/send.d.ts.map +1 -1
  32. package/dist/agent-farm/commands/send.js +27 -2
  33. package/dist/agent-farm/commands/send.js.map +1 -1
  34. package/dist/agent-farm/commands/spawn.d.ts +7 -0
  35. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  36. package/dist/agent-farm/commands/spawn.js +13 -1
  37. package/dist/agent-farm/commands/spawn.js.map +1 -1
  38. package/dist/agent-farm/lib/tower-client.d.ts +12 -0
  39. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
  40. package/dist/agent-farm/lib/tower-client.js +12 -0
  41. package/dist/agent-farm/lib/tower-client.js.map +1 -1
  42. package/dist/agent-farm/servers/mailbox-delivery.d.ts +141 -13
  43. package/dist/agent-farm/servers/mailbox-delivery.d.ts.map +1 -1
  44. package/dist/agent-farm/servers/mailbox-delivery.js +172 -16
  45. package/dist/agent-farm/servers/mailbox-delivery.js.map +1 -1
  46. package/dist/agent-farm/servers/mailbox-wiring.d.ts +23 -1
  47. package/dist/agent-farm/servers/mailbox-wiring.d.ts.map +1 -1
  48. package/dist/agent-farm/servers/mailbox-wiring.js +91 -31
  49. package/dist/agent-farm/servers/mailbox-wiring.js.map +1 -1
  50. package/dist/agent-farm/servers/message-write.d.ts +58 -18
  51. package/dist/agent-farm/servers/message-write.d.ts.map +1 -1
  52. package/dist/agent-farm/servers/message-write.js +73 -28
  53. package/dist/agent-farm/servers/message-write.js.map +1 -1
  54. package/dist/agent-farm/servers/render-gate.d.ts +13 -0
  55. package/dist/agent-farm/servers/render-gate.d.ts.map +1 -1
  56. package/dist/agent-farm/servers/render-gate.js +21 -0
  57. package/dist/agent-farm/servers/render-gate.js.map +1 -1
  58. package/dist/agent-farm/servers/session-submit.d.ts +220 -27
  59. package/dist/agent-farm/servers/session-submit.d.ts.map +1 -1
  60. package/dist/agent-farm/servers/session-submit.js +333 -42
  61. package/dist/agent-farm/servers/session-submit.js.map +1 -1
  62. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  63. package/dist/agent-farm/servers/tower-routes.js +114 -25
  64. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  65. package/dist/agent-farm/servers/tower-tunnel.d.ts.map +1 -1
  66. package/dist/agent-farm/servers/tower-tunnel.js +14 -0
  67. package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
  68. package/dist/agent-farm/types.d.ts +36 -1
  69. package/dist/agent-farm/types.d.ts.map +1 -1
  70. package/dist/agent-farm/utils/message-format.d.ts +60 -4
  71. package/dist/agent-farm/utils/message-format.d.ts.map +1 -1
  72. package/dist/agent-farm/utils/message-format.js +115 -22
  73. package/dist/agent-farm/utils/message-format.js.map +1 -1
  74. package/dist/agent-farm/utils/server-utils.d.ts +8 -2
  75. package/dist/agent-farm/utils/server-utils.d.ts.map +1 -1
  76. package/dist/agent-farm/utils/server-utils.js +19 -2
  77. package/dist/agent-farm/utils/server-utils.js.map +1 -1
  78. package/dist/commands/porch/context-refresh.d.ts +181 -0
  79. package/dist/commands/porch/context-refresh.d.ts.map +1 -0
  80. package/dist/commands/porch/context-refresh.js +270 -0
  81. package/dist/commands/porch/context-refresh.js.map +1 -0
  82. package/dist/commands/porch/index.d.ts +6 -0
  83. package/dist/commands/porch/index.d.ts.map +1 -1
  84. package/dist/commands/porch/index.js +46 -0
  85. package/dist/commands/porch/index.js.map +1 -1
  86. package/dist/commands/porch/next.d.ts +0 -9
  87. package/dist/commands/porch/next.d.ts.map +1 -1
  88. package/dist/commands/porch/next.js +133 -4
  89. package/dist/commands/porch/next.js.map +1 -1
  90. package/dist/commands/porch/protocol.d.ts.map +1 -1
  91. package/dist/commands/porch/protocol.js +102 -0
  92. package/dist/commands/porch/protocol.js.map +1 -1
  93. package/dist/commands/porch/types.d.ts +61 -0
  94. package/dist/commands/porch/types.d.ts.map +1 -1
  95. package/dist/lib/self-refresh-invocation.d.ts +60 -0
  96. package/dist/lib/self-refresh-invocation.d.ts.map +1 -0
  97. package/dist/lib/self-refresh-invocation.js +64 -0
  98. package/dist/lib/self-refresh-invocation.js.map +1 -0
  99. package/dist/lib/test-env.d.ts +50 -0
  100. package/dist/lib/test-env.d.ts.map +1 -1
  101. package/dist/lib/test-env.js +76 -0
  102. package/dist/lib/test-env.js.map +1 -1
  103. package/package.json +4 -4
  104. package/skeleton/.claude/skills/arch-save/SKILL.md +8 -2
  105. package/skeleton/.claude/skills/builder-refresh/SKILL.md +138 -0
  106. package/skeleton/.codex/skills/arch-save/SKILL.md +8 -2
  107. package/skeleton/.codex/skills/builder-refresh/SKILL.md +138 -0
  108. package/skeleton/protocol-schema.json +17 -0
  109. package/skeleton/protocols/air/protocol.json +1 -1
  110. package/skeleton/protocols/aspir/protocol.json +5 -1
  111. package/skeleton/protocols/bugfix/protocol.json +1 -1
  112. package/skeleton/protocols/experiment/protocol.json +1 -1
  113. package/skeleton/protocols/maintain/protocol.json +1 -1
  114. package/skeleton/protocols/pir/protocol.json +1 -1
  115. package/skeleton/protocols/protocol-schema.json +17 -0
  116. package/skeleton/protocols/research/protocol.json +1 -1
  117. package/skeleton/protocols/spike/protocol.json +1 -1
  118. package/skeleton/protocols/spir/protocol.json +5 -1
@@ -73,6 +73,107 @@ function findProtocolFile(workspaceRoot, protocolName) {
73
73
  }
74
74
  return null;
75
75
  }
76
+ /**
77
+ * Parse and validate a protocol's `context_refresh` block (Spec 1470).
78
+ *
79
+ * ## Why this rejects rather than ignores
80
+ *
81
+ * There is no runtime schema validation anywhere in porch — `loadProtocol` is
82
+ * `JSON.parse` plus this hand-rolled normalizer, and `protocol-schema.json` is
83
+ * editor tooling that validates nothing at run time. So an unresolvable
84
+ * declaration has no other layer to catch it: a boundary naming a phase the
85
+ * protocol does not have would simply never match a transition, and the protocol
86
+ * author would see a feature that is configured, reports no error, and silently
87
+ * never fires.
88
+ *
89
+ * A context refresh that does not happen is invisible by nature — the builder
90
+ * just keeps accumulating context — so this is the ONLY place the mistake can
91
+ * be made loud. Every rejection names the offending value, because "invalid
92
+ * context_refresh" sends the author back to guess which of several keys is wrong.
93
+ *
94
+ * @param raw The `context_refresh` value as it appears in protocol.json
95
+ * @param phases Already-normalized phases, used to prove each boundary resolves
96
+ * @param protocolName For error messages
97
+ */
98
+ function normalizeContextRefresh(raw, phases, protocolName) {
99
+ // ONLY `undefined` means "omitted". An explicit `null` is a configuration
100
+ // act that would silently do nothing, which is the same silent no-op this
101
+ // function exists to reject — and all three schemas type this key as an
102
+ // object, so `null` violates them too. An author who wants no refreshes omits
103
+ // the key.
104
+ if (raw === undefined)
105
+ return undefined;
106
+ const fail = (msg) => {
107
+ throw new Error(`Invalid protocol '${protocolName}': context_refresh ${msg}`);
108
+ };
109
+ if (raw === null) {
110
+ return fail('is null; omit the key entirely to declare no refresh boundaries');
111
+ }
112
+ if (typeof raw !== 'object' || Array.isArray(raw)) {
113
+ return fail(`must be an object, got ${Array.isArray(raw) ? 'array' : typeof raw}`);
114
+ }
115
+ const obj = raw;
116
+ // Unknown keys are rejected rather than ignored: a typo'd key
117
+ // ("on_entry" for "on_enter") is indistinguishable from "declared nothing"
118
+ // if we skip it, which is the silent-no-op failure this whole function exists
119
+ // to prevent.
120
+ const KNOWN = new Set(['on_enter', 'on_plan_phase_advance']);
121
+ for (const key of Object.keys(obj)) {
122
+ if (!KNOWN.has(key)) {
123
+ return fail(`has unknown key '${key}' (expected one of: ${[...KNOWN].join(', ')})`);
124
+ }
125
+ }
126
+ let on_enter;
127
+ if (obj.on_enter !== undefined) {
128
+ if (!Array.isArray(obj.on_enter)) {
129
+ return fail(`on_enter must be an array of phase ids, got ${typeof obj.on_enter}`);
130
+ }
131
+ const phaseIds = new Set(phases.map(p => p.id));
132
+ for (const entry of obj.on_enter) {
133
+ if (typeof entry !== 'string') {
134
+ return fail(`on_enter entries must be strings, got ${typeof entry}`);
135
+ }
136
+ if (!phaseIds.has(entry)) {
137
+ return fail(`on_enter names phase '${entry}', which this protocol does not have ` +
138
+ `(phases: ${[...phaseIds].join(', ')})`);
139
+ }
140
+ // The protocol's FIRST phase is never transitioned INTO — `porch init`
141
+ // sets it directly as the starting state, and every transition site moves
142
+ // to a SUCCESSOR. So an entry boundary on it would validate cleanly and
143
+ // then never fire: the same silent no-op rejected just above for
144
+ // `on_plan_phase_advance`, and the reason this validator exists.
145
+ if (entry === phases[0]?.id) {
146
+ return fail(`on_enter names '${entry}', which is this protocol's first phase. A project ` +
147
+ `STARTS there rather than transitioning into it, so the boundary could never fire`);
148
+ }
149
+ }
150
+ // Duplicates resolve fine but say something the author did not mean — a
151
+ // boundary cannot fire twice on one transition. Rejecting keeps the runtime
152
+ // in step with the schemas' `uniqueItems`, so the two cannot disagree.
153
+ const seen = new Set();
154
+ for (const entry of obj.on_enter) {
155
+ if (seen.has(entry))
156
+ return fail(`on_enter lists phase '${entry}' more than once`);
157
+ seen.add(entry);
158
+ }
159
+ on_enter = obj.on_enter;
160
+ }
161
+ let on_plan_phase_advance;
162
+ if (obj.on_plan_phase_advance !== undefined) {
163
+ if (typeof obj.on_plan_phase_advance !== 'boolean') {
164
+ return fail(`on_plan_phase_advance must be a boolean, got ${typeof obj.on_plan_phase_advance}`);
165
+ }
166
+ // A protocol with no per_plan_phase phase never advances between plan
167
+ // phases, so `true` here is a declaration that can never fire — the exact
168
+ // silent no-op this validator exists to reject.
169
+ if (obj.on_plan_phase_advance && !phases.some(p => p.type === 'per_plan_phase')) {
170
+ return fail(`on_plan_phase_advance is true, but this protocol has no 'per_plan_phase' phase, ` +
171
+ `so the boundary could never fire`);
172
+ }
173
+ on_plan_phase_advance = obj.on_plan_phase_advance;
174
+ }
175
+ return { on_enter, on_plan_phase_advance };
176
+ }
76
177
  /**
77
178
  * Normalize protocol JSON to our simplified Protocol type
78
179
  */
@@ -136,6 +237,7 @@ function normalizeProtocol(json) {
136
237
  phases,
137
238
  checks,
138
239
  phase_completion,
240
+ context_refresh: normalizeContextRefresh(obj.context_refresh, phases, obj.name),
139
241
  };
140
242
  }
141
243
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/commands/porch/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEzE,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,aAAqB,EAAE,YAAoB;IACtE,MAAM,YAAY,GAAG,gBAAgB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAEnE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,gBAAgB;YACzC,iCAAiC,YAAY,sBAAsB,YAAY,mCAAmC,YAAY,GAAG,CAClI,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,aAAqB,EAAE,YAAoB;IACnE,qCAAqC;IACrC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,YAAY,gBAAgB,EAAE,aAAa,CAAC,CAAC;IAC5F,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,6DAA6D;IAC7D,sCAAsC;IACtC,MAAM,YAAY,GAAG;QACnB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,WAAW,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,CAAC;KAClD,CAAC;IACF,4BAA4B;IAC5B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;IAE5D,KAAK,MAAM,YAAY,IAAI,YAAY,EAAE,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,SAAS;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;iBAC/D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;gBACpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACvC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;oBAC/D,IAAI,OAAO,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;wBACnC,OAAO,QAAQ,CAAC;oBAClB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAa;IACtC,MAAM,GAAG,GAAG,IAA+B,CAAC;IAE5C,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,MAAM,GAAoB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,8DAA8D;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7C,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAA6B,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA+C,CAAC;IACrE,IAAI,QAAQ,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAiC,CAAC,EAAE,CAAC;YACrF,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAClC,CAAC;iBAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;gBACvE,MAAM,QAAQ,GAAG,GAA8B,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAiB,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAyB,EAAE,CAAC;YAClG,CAAC;QACH,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAwC,EAAE,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACrD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAiC,CAAC,EAAE,CAAC;gBACpF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;oBACtE,MAAM,QAAQ,GAAG,KAAgC,CAAC;oBAClD,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAiB,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAyB,EAAE,CAAC;gBAClG,CAAC;qBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,gBAAoD,CAAC;IACzD,IAAI,GAAG,CAAC,gBAAgB,IAAI,OAAO,GAAG,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QACrE,gBAAgB,GAAG,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAA2C,CAAC,EAAE,CAAC;YAC1F,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBAC5B,gBAAgB,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAc;QACxB,OAAO,EAAE,GAAG,CAAC,OAA6B;QAC1C,WAAW,EAAE,GAAG,CAAC,WAAiC;QAClD,MAAM;QACN,MAAM;QACN,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,CAAU;IAChC,MAAM,KAAK,GAAG,CAA4B,CAAC;IAE3C,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,+CAA+C;IAC/C,IAAI,IAA+B,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAiD,CAAC;IAE3E,4DAA4D;IAC5D,IAAI,QAA4B,CAAC;IACjC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAA+B,CAAC;QACtD,QAAQ,GAAG,OAAO,CAAC,IAA0B,CAAC;QAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,GAAG,OAAO,CAAC,IAAqB,CAAC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,WAAW,EAAE,CAAC;QAC5B,IAAI,GAAG,UAAU,CAAC,WAAqB,CAAC;IAC1C,CAAC;IAED,sBAAsB;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAiC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,+CAA+C;IAC/C,IAAI,KAA8B,CAAC;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAA4C,CAAC;IACpE,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,GAAG;YACN,MAAM,EAAE,QAAQ,CAAC,MAAgB;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAkB;SACtC,CAAC;IACJ,CAAC;IAED,gDAAgD;IAChD,IAAI,MAAgC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,MAA6C,CAAC;IACtE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,GAAG;YACP,IAAI,EAAE,SAAS,CAAC,IAAc;YAC9B,MAAM,EAAE,SAAS,CAAC,MAAkB;YACpC,QAAQ,EAAG,SAAS,CAAC,QAAoB,IAAI,IAAI;SAClD,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,IAAI,WAAyC,CAAC;IAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,WAAkD,CAAC;IAC/E,IAAI,aAAa,EAAE,CAAC;QAClB,WAAW,GAAG;YACZ,MAAM,EAAE,aAAa,CAAC,MAA6B;YACnD,IAAI,EAAE,aAAa,CAAC,IAA2B;SAChD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAY;QACtB,IAAI,EAAG,KAAK,CAAC,IAAe,IAAI,KAAK,CAAC,EAAY;QAClD,IAAI,EAAE,KAAK,CAAC,IAA8D;QAC1E,KAAK;QACL,MAAM;QACN,cAAc,EAAG,KAAK,CAAC,cAAyB,IAAI,CAAC;QACrD,WAAW;QACX,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC9C,IAAI;KACL,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,OAAe;IAChE,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB,EAAE,cAAsB;IACrE,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAkB,EAClB,OAAe,EACf,SAA0B;IAE1B,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,sEAAsE;IACtE,6EAA6E;IAC7E,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;YAChC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;YACrC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,IAAI,EAAE,CAAC;SAChD,CAAC,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS,CAAC,8BAA8B;YAClE,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS,CAAC,8BAA8B;YACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uCAAuC,IAAI,oCAAoC,CAChF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAA6B,EAAE,CAAC;IAC5C,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,IAAI;gBAAE,SAAS,CAAC,kBAAkB;YAC/C,MAAM,CAAC,SAAS,CAAC,GAAG;gBAClB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO;gBACzC,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;aAC9B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB,EAAE,OAAe;IAC9D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAkB,EAAE,OAAe;IAC1D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,IAAI,KAAK,gBAAgB,CAAC;AAC1C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAAkB,EAClB,SAA0B;IAE1B,MAAM,IAAI,GAAG,QAAQ,CAAC,gBAAgB,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,sEAAsE;IACtE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;QAChC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;QACrC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,IAAI,EAAE,CAAC;KAChD,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uCAAuC,IAAI,oCAAoC,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,QAAQ,EAAE,IAAI;YAAE,SAAS,CAAC,+BAA+B;QAC7D,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,OAAe;IAC/D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,OAAe;IAChE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAkB,EAAE,OAAe;IACjE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAkB,EAAE,OAAe;IAClE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,cAAc,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAkB,EAAE,OAAe;IACrE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,WAAW,IAAI,IAAI,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkB,EAAE,OAAe;IACnE,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/commands/porch/protocol.ts"],"names":[],"mappings":"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"}
@@ -59,6 +59,43 @@ export interface CheckOverride {
59
59
  }
60
60
  /** Map of check name → override, from .codev/config.json `porch.checks` */
61
61
  export type CheckOverrides = Record<string, CheckOverride>;
62
+ /**
63
+ * Context-refresh boundaries a protocol declares (Spec 1470).
64
+ *
65
+ * A "boundary" is a moment porch already transitions the state machine, at which
66
+ * a builder's context can be refreshed without losing anything: the artifacts,
67
+ * `status.yaml`, the thread narrative and git carry the durable state, so a
68
+ * refreshed builder re-orients from disk rather than from memory.
69
+ *
70
+ * Keyed by porch's OWN transition points rather than by protocol-shaped literal
71
+ * names (`after-spec`, `before-review`). A literal name has to be mapped onto a
72
+ * real transition somewhere, and that mapping is exactly what goes stale when a
73
+ * protocol changes shape — leaving a boundary that can be declared but never
74
+ * fires. Naming the transition directly removes the translation layer.
75
+ *
76
+ * Absent key means no refreshes, which is the default for every protocol that
77
+ * does not opt in.
78
+ */
79
+ export interface ContextRefreshConfig {
80
+ /**
81
+ * Protocol phase ids to refresh on ENTRY to.
82
+ *
83
+ * Entry, not exit: the spec requires the refresh to happen after the gate
84
+ * outcome and the phase transition are durable in `status.yaml`, so a
85
+ * refreshed builder cannot mistake "waiting at a gate" for "approved".
86
+ */
87
+ on_enter?: string[];
88
+ /**
89
+ * Refresh when advancing from one plan phase to the NEXT one.
90
+ *
91
+ * "Advance between", not "enter each": entering the `implement` phase IS
92
+ * entering the first plan phase, so a per-plan-phase boundary that fired on
93
+ * entry would fire twice in a row at that moment. Defining it as advancement
94
+ * excludes the first plan phase by construction rather than by a dedup rule
95
+ * somebody has to remember.
96
+ */
97
+ on_plan_phase_advance?: boolean;
98
+ }
62
99
  /**
63
100
  * Protocol definition (loaded from protocol.json)
64
101
  */
@@ -69,6 +106,7 @@ export interface Protocol {
69
106
  phases: ProtocolPhase[];
70
107
  checks?: Record<string, CheckDef>;
71
108
  phase_completion?: Record<string, string>;
109
+ context_refresh?: ContextRefreshConfig;
72
110
  }
73
111
  /**
74
112
  * Gate status
@@ -161,6 +199,29 @@ export interface ProjectState {
161
199
  * pre-date this field stay parseable.
162
200
  */
163
201
  pr_ready_for_human?: boolean;
202
+ /**
203
+ * Context-refresh boundaries already consumed for this project (Spec 1470).
204
+ *
205
+ * Appended in the SAME state write as the transition that triggered the
206
+ * boundary, which is what makes at-most-once a property of the control flow
207
+ * rather than a guard. A refresh is destructive (`/clear` has no undo) and
208
+ * porch transitions can loop — #1408 reset every plan phase to `pending` —
209
+ * so "already refreshed here" must be a recorded fact, never inferred from
210
+ * phase or iteration.
211
+ *
212
+ * `acknowledged_at` is set by PORCH (never by the builder, which is forbidden
213
+ * from writing this file) on the first normal-path `porch next` after the
214
+ * boundary. A boundary recorded but never acknowledged means the builder did
215
+ * not come back — the unattended-stall signal, which cannot be derived from
216
+ * `updated_at` because the normal task-emission path writes no state at all.
217
+ *
218
+ * Optional so status files predating this field stay parseable.
219
+ */
220
+ context_refreshes?: Array<{
221
+ boundary: string;
222
+ at: string;
223
+ acknowledged_at?: string;
224
+ }>;
164
225
  started_at: string;
165
226
  updated_at: string;
166
227
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * The ONE place that spells out how to invoke `afx self-refresh` (Spec 1470).
3
+ *
4
+ * ## Why this module exists
5
+ *
6
+ * `--boundary` is not cosmetic: it binds the challenge to the boundary it was
7
+ * issued at, so a challenge left behind by an aborted refresh cannot be used to
8
+ * clear a builder at a LATER boundary, against a save describing work that has
9
+ * since moved on. Any instruction that omits the flag silently disables that
10
+ * guard for whoever follows it.
11
+ *
12
+ * That has already happened twice on this feature, in two different places, and
13
+ * the second was fixed one commit after the first:
14
+ *
15
+ * 1. porch's refresh task text printed `afx self-refresh --begin` with no
16
+ * boundary — so the guard was inert in production from the moment it
17
+ * shipped.
18
+ * 2. the CLI's own `--begin` output printed a bare `afx self-refresh` as the
19
+ * follow-up — so anyone following the command's own instruction dropped the
20
+ * guard.
21
+ *
22
+ * Two call sites, two identical omissions. A third was about to appear in the
23
+ * builder-refresh skill. The generalisation is that **when a guard depends on a
24
+ * flag, every place that tells a human or an agent how to invoke the command is
25
+ * part of that guard** — so the emission belongs in one function rather than
26
+ * being retyped wherever it is needed.
27
+ *
28
+ * ## What this does NOT solve, and how that is handled
29
+ *
30
+ * The skill is Markdown and cannot import anything. Rather than adding a third
31
+ * hand-written copy, the skill **defers**: it tells the builder to run the exact
32
+ * commands porch's refresh task supplied, instead of restating them.
33
+ * `spec-1470-reentry-frame.test.ts` asserts the skill contains NO hand-written
34
+ * invocation at all — stricter than checking each one carries the flag, and it
35
+ * fails on the first line someone adds rather than on the first mistake.
36
+ * Deferring beats duplicating-and-checking: a copy that is merely checked still
37
+ * has to be kept correct in two places.
38
+ *
39
+ * Lives in `src/lib/` because both callers already depend on it and neither
40
+ * depends on the other in this direction: the established import direction is
41
+ * agent-farm → porch, so putting a shared helper in agent-farm and importing it
42
+ * from porch would reverse it.
43
+ */
44
+ export interface SelfRefreshInvocation {
45
+ /** Step 1: mint the challenge and print what to save. */
46
+ begin: string;
47
+ /** Step 2: verify the save, then clear and re-orient. */
48
+ execute: string;
49
+ }
50
+ /**
51
+ * Build both halves of the handshake, carrying the boundary through.
52
+ *
53
+ * A missing `boundary` is a legitimate case — a builder refreshing outside a
54
+ * porch task has no boundary to bind — and produces the flagless form. What must
55
+ * never happen is a boundary being KNOWN and dropped from the instruction, which
56
+ * is exactly what a hand-typed command in a second file does the moment someone
57
+ * edits one and not the other.
58
+ */
59
+ export declare function selfRefreshInvocation(boundary?: string): SelfRefreshInvocation;
60
+ //# sourceMappingURL=self-refresh-invocation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-refresh-invocation.d.ts","sourceRoot":"","sources":["../../src/lib/self-refresh-invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAOH,MAAM,WAAW,qBAAqB;IACpC,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAM9E"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * The ONE place that spells out how to invoke `afx self-refresh` (Spec 1470).
3
+ *
4
+ * ## Why this module exists
5
+ *
6
+ * `--boundary` is not cosmetic: it binds the challenge to the boundary it was
7
+ * issued at, so a challenge left behind by an aborted refresh cannot be used to
8
+ * clear a builder at a LATER boundary, against a save describing work that has
9
+ * since moved on. Any instruction that omits the flag silently disables that
10
+ * guard for whoever follows it.
11
+ *
12
+ * That has already happened twice on this feature, in two different places, and
13
+ * the second was fixed one commit after the first:
14
+ *
15
+ * 1. porch's refresh task text printed `afx self-refresh --begin` with no
16
+ * boundary — so the guard was inert in production from the moment it
17
+ * shipped.
18
+ * 2. the CLI's own `--begin` output printed a bare `afx self-refresh` as the
19
+ * follow-up — so anyone following the command's own instruction dropped the
20
+ * guard.
21
+ *
22
+ * Two call sites, two identical omissions. A third was about to appear in the
23
+ * builder-refresh skill. The generalisation is that **when a guard depends on a
24
+ * flag, every place that tells a human or an agent how to invoke the command is
25
+ * part of that guard** — so the emission belongs in one function rather than
26
+ * being retyped wherever it is needed.
27
+ *
28
+ * ## What this does NOT solve, and how that is handled
29
+ *
30
+ * The skill is Markdown and cannot import anything. Rather than adding a third
31
+ * hand-written copy, the skill **defers**: it tells the builder to run the exact
32
+ * commands porch's refresh task supplied, instead of restating them.
33
+ * `spec-1470-reentry-frame.test.ts` asserts the skill contains NO hand-written
34
+ * invocation at all — stricter than checking each one carries the flag, and it
35
+ * fails on the first line someone adds rather than on the first mistake.
36
+ * Deferring beats duplicating-and-checking: a copy that is merely checked still
37
+ * has to be kept correct in two places.
38
+ *
39
+ * Lives in `src/lib/` because both callers already depend on it and neither
40
+ * depends on the other in this direction: the established import direction is
41
+ * agent-farm → porch, so putting a shared helper in agent-farm and importing it
42
+ * from porch would reverse it.
43
+ */
44
+ /** Shell-quote a boundary id for safe inclusion in a printed command. */
45
+ function quote(value) {
46
+ return `'${value.replace(/'/g, `'\\''`)}'`;
47
+ }
48
+ /**
49
+ * Build both halves of the handshake, carrying the boundary through.
50
+ *
51
+ * A missing `boundary` is a legitimate case — a builder refreshing outside a
52
+ * porch task has no boundary to bind — and produces the flagless form. What must
53
+ * never happen is a boundary being KNOWN and dropped from the instruction, which
54
+ * is exactly what a hand-typed command in a second file does the moment someone
55
+ * edits one and not the other.
56
+ */
57
+ export function selfRefreshInvocation(boundary) {
58
+ const suffix = boundary ? ` --boundary ${quote(boundary)}` : '';
59
+ return {
60
+ begin: `afx self-refresh --begin${suffix}`,
61
+ execute: `afx self-refresh${suffix}`,
62
+ };
63
+ }
64
+ //# sourceMappingURL=self-refresh-invocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-refresh-invocation.js","sourceRoot":"","sources":["../../src/lib/self-refresh-invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,yEAAyE;AACzE,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AASD;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,OAAO;QACL,KAAK,EAAE,2BAA2B,MAAM,EAAE;QAC1C,OAAO,EAAE,mBAAmB,MAAM,EAAE;KACrC,CAAC;AACJ,CAAC"}
@@ -71,4 +71,54 @@ export declare function realAgyOptIn(): boolean;
71
71
  * `agy-integration.e2e.test.ts` short-circuits on the opt-in before resolving.
72
72
  */
73
73
  export declare function assertAgyLaneAllowedUnderTest(): void;
74
+ /**
75
+ * True when cloud-mutating side effects must be refused because we are running
76
+ * under a test (#1515).
77
+ *
78
+ * "Cloud-mutating" means the two irreversible halves of tunnel disconnect:
79
+ * the server-side deregister of the tower ID, and the deletion of the local
80
+ * cloud credentials. Both act on whatever `~/.agent-farm/cloud-config.json`
81
+ * happens to be visible — which, before the agent-farm dir became isolatable,
82
+ * was the developer's real one.
83
+ *
84
+ * `NODE_ENV` is checked alongside `VITEST` because the tower-test helpers set
85
+ * `NODE_ENV=test` explicitly on the Towers they spawn, and `VITEST` is checked
86
+ * alongside `NODE_ENV` because children inherit it through `{ ...process.env }`
87
+ * even when a suite forgets to set `NODE_ENV`. Either marker is enough.
88
+ *
89
+ * `isUnderTestRunner()` above deliberately refuses generic markers, because a
90
+ * false positive there makes a real consultation *throw*. The trade here runs
91
+ * the other way, so `NODE_ENV` earns its place: a false positive costs a user
92
+ * running Tower with `NODE_ENV=test` a 403 that names the override, while a
93
+ * false negative deregisters their Tower and drops the tunnel until they
94
+ * notice. Loud and recoverable beats silent and destructive.
95
+ */
96
+ export declare function isUnderTest(): boolean;
97
+ /**
98
+ * Explicit opt-in for a test that genuinely means to exercise the cloud
99
+ * disconnect path — necessarily one that owns a fake cloud config in an
100
+ * isolated `CODEV_AGENT_FARM_DIR`. Unset by default, so no suite can deregister
101
+ * a real Tower by omission.
102
+ */
103
+ export declare function cloudMutationOptIn(): boolean;
104
+ /**
105
+ * True when a cloud-mutating operation should be refused right now.
106
+ */
107
+ export declare function cloudMutationBlocked(): boolean;
108
+ /**
109
+ * Guard the *client* half of #1515: refuse to drive tunnel connect/disconnect
110
+ * against the **default** Tower port from under a test runner.
111
+ *
112
+ * The server-side guard cannot cover this case. A developer's real Tower on
113
+ * :4100 runs with neither `VITEST` nor `NODE_ENV=test`, so it will happily
114
+ * serve a disconnect — and `vitest-e2e-setup.ts` hands every loopback `fetch`
115
+ * the real `~/.agent-farm/local-key`, so such a request arrives fully
116
+ * authenticated. That is how a suite run deregistered a live Tower and left its
117
+ * tunnel down for hours.
118
+ *
119
+ * Scoped as narrowly as it can be: only the two mutating subpaths, only on the
120
+ * default port. A test that spawns its own Tower talks to an ephemeral port and
121
+ * is unaffected; `/api/tunnel/status` is a read and stays allowed.
122
+ */
123
+ export declare function assertTunnelMutationAllowedUnderTest(path: string, targetsDefaultTowerPort: boolean): void;
74
124
  //# sourceMappingURL=test-env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-env.d.ts","sourceRoot":"","sources":["../../src/lib/test-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAGtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,6BAA6B,IAAI,IAAI,CAYpD"}
1
+ {"version":3,"file":"test-env.d.ts","sourceRoot":"","sources":["../../src/lib/test-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAGtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,6BAA6B,IAAI,IAAI,CAYpD;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAG5C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAKD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oCAAoC,CAClD,IAAI,EAAE,MAAM,EACZ,uBAAuB,EAAE,OAAO,GAC/B,IAAI,CAgBN"}
@@ -89,4 +89,80 @@ export function assertAgyLaneAllowedUnderTest() {
89
89
  '(the vitest harness in vitest-setup.ts does this for every suite), or set ' +
90
90
  'CODEV_ALLOW_REAL_AGY=1 if this test genuinely means to run the real CLI.');
91
91
  }
92
+ /**
93
+ * True when cloud-mutating side effects must be refused because we are running
94
+ * under a test (#1515).
95
+ *
96
+ * "Cloud-mutating" means the two irreversible halves of tunnel disconnect:
97
+ * the server-side deregister of the tower ID, and the deletion of the local
98
+ * cloud credentials. Both act on whatever `~/.agent-farm/cloud-config.json`
99
+ * happens to be visible — which, before the agent-farm dir became isolatable,
100
+ * was the developer's real one.
101
+ *
102
+ * `NODE_ENV` is checked alongside `VITEST` because the tower-test helpers set
103
+ * `NODE_ENV=test` explicitly on the Towers they spawn, and `VITEST` is checked
104
+ * alongside `NODE_ENV` because children inherit it through `{ ...process.env }`
105
+ * even when a suite forgets to set `NODE_ENV`. Either marker is enough.
106
+ *
107
+ * `isUnderTestRunner()` above deliberately refuses generic markers, because a
108
+ * false positive there makes a real consultation *throw*. The trade here runs
109
+ * the other way, so `NODE_ENV` earns its place: a false positive costs a user
110
+ * running Tower with `NODE_ENV=test` a 403 that names the override, while a
111
+ * false negative deregisters their Tower and drops the tunnel until they
112
+ * notice. Loud and recoverable beats silent and destructive.
113
+ */
114
+ export function isUnderTest() {
115
+ return isUnderTestRunner() || process.env.NODE_ENV === 'test';
116
+ }
117
+ /**
118
+ * Explicit opt-in for a test that genuinely means to exercise the cloud
119
+ * disconnect path — necessarily one that owns a fake cloud config in an
120
+ * isolated `CODEV_AGENT_FARM_DIR`. Unset by default, so no suite can deregister
121
+ * a real Tower by omission.
122
+ */
123
+ export function cloudMutationOptIn() {
124
+ const raw = process.env.CODEV_ALLOW_TEST_CLOUD_MUTATION;
125
+ return raw === '1' || raw === 'true';
126
+ }
127
+ /**
128
+ * True when a cloud-mutating operation should be refused right now.
129
+ */
130
+ export function cloudMutationBlocked() {
131
+ return isUnderTest() && !cloudMutationOptIn();
132
+ }
133
+ /** The `/api/tunnel/` subpaths that mutate cloud state. */
134
+ const TUNNEL_MUTATION_PATH = /^\/api\/tunnel\/(connect|disconnect)(?:[/?#]|$)/;
135
+ /**
136
+ * Guard the *client* half of #1515: refuse to drive tunnel connect/disconnect
137
+ * against the **default** Tower port from under a test runner.
138
+ *
139
+ * The server-side guard cannot cover this case. A developer's real Tower on
140
+ * :4100 runs with neither `VITEST` nor `NODE_ENV=test`, so it will happily
141
+ * serve a disconnect — and `vitest-e2e-setup.ts` hands every loopback `fetch`
142
+ * the real `~/.agent-farm/local-key`, so such a request arrives fully
143
+ * authenticated. That is how a suite run deregistered a live Tower and left its
144
+ * tunnel down for hours.
145
+ *
146
+ * Scoped as narrowly as it can be: only the two mutating subpaths, only on the
147
+ * default port. A test that spawns its own Tower talks to an ephemeral port and
148
+ * is unaffected; `/api/tunnel/status` is a read and stays allowed.
149
+ */
150
+ export function assertTunnelMutationAllowedUnderTest(path, targetsDefaultTowerPort) {
151
+ if (!targetsDefaultTowerPort)
152
+ return;
153
+ if (!TUNNEL_MUTATION_PATH.test(path))
154
+ return;
155
+ if (!cloudMutationBlocked())
156
+ return;
157
+ const message = `Refusing to POST ${path} to the default Tower port from under a test ` +
158
+ 'runner (#1515). That port is the developer\'s real Tower, and the request ' +
159
+ 'would carry their real local key: a disconnect there deregisters their ' +
160
+ 'Tower server-side and deletes their cloud credentials. Point the client at ' +
161
+ 'a test Tower\'s port, or set CODEV_ALLOW_TEST_CLOUD_MUTATION=1 if this test ' +
162
+ 'genuinely means to mutate real cloud state.';
163
+ // signalTunnel() swallows its errors, so make sure the reason is visible even
164
+ // when the throw is caught and discarded.
165
+ console.error(new Error(message).stack);
166
+ throw new Error(message);
167
+ }
92
168
  //# sourceMappingURL=test-env.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test-env.js","sourceRoot":"","sources":["../../src/lib/test-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC7C,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,6BAA6B;IAC3C,IAAI,CAAC,iBAAiB,EAAE;QAAE,OAAO;IACjC,IAAI,YAAY,EAAE;QAAE,OAAO;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;QAAE,OAAO;IACtC,MAAM,IAAI,KAAK,CACb,0EAA0E;QAC1E,sEAAsE;QACtE,yEAAyE;QACzE,wEAAwE;QACxE,4EAA4E;QAC5E,0EAA0E,CAC3E,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"test-env.js","sourceRoot":"","sources":["../../src/lib/test-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAC7C,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,6BAA6B;IAC3C,IAAI,CAAC,iBAAiB,EAAE;QAAE,OAAO;IACjC,IAAI,YAAY,EAAE;QAAE,OAAO;IAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;QAAE,OAAO;IACtC,MAAM,IAAI,KAAK,CACb,0EAA0E;QAC1E,sEAAsE;QACtE,yEAAyE;QACzE,wEAAwE;QACxE,4EAA4E;QAC5E,0EAA0E,CAC3E,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,iBAAiB,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;IACxD,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAChD,CAAC;AAED,2DAA2D;AAC3D,MAAM,oBAAoB,GAAG,iDAAiD,CAAC;AAE/E;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oCAAoC,CAClD,IAAY,EACZ,uBAAgC;IAEhC,IAAI,CAAC,uBAAuB;QAAE,OAAO;IACrC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO;IAC7C,IAAI,CAAC,oBAAoB,EAAE;QAAE,OAAO;IAEpC,MAAM,OAAO,GACX,oBAAoB,IAAI,+CAA+C;QACvE,4EAA4E;QAC5E,yEAAyE;QACzE,6EAA6E;QAC7E,8EAA8E;QAC9E,6CAA6C,CAAC;IAChD,8EAA8E;IAC9E,0CAA0C;IAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cluesmith/codev",
3
- "version": "3.3.1",
3
+ "version": "3.3.2",
4
4
  "description": "Codev CLI - AI-assisted software development framework",
5
5
  "type": "module",
6
6
  "bin": {
@@ -35,9 +35,9 @@
35
35
  "open": "^10.1.0",
36
36
  "tree-kill": "^1.2.2",
37
37
  "ws": "^8.18.0",
38
- "@cluesmith/codev-core": "3.3.1",
39
- "@cluesmith/codev-sdk": "3.3.1",
40
- "@cluesmith/codev-types": "3.3.1"
38
+ "@cluesmith/codev-core": "3.3.2",
39
+ "@cluesmith/codev-sdk": "3.3.2",
40
+ "@cluesmith/codev-types": "3.3.2"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@playwright/test": "^1.58.0",
@@ -107,8 +107,14 @@ guarantee about the clear's completion. If the timing is wrong the re-init arriv
107
107
  wrong moment, which costs one manual message (see below) and nothing else. That is the
108
108
  whole reason this cycle can be built on a delay rather than on machinery.
109
109
 
110
- Delayed sends are **not persisted** — if Tower restarts inside the window, the message is
111
- dropped. That is recoverable; see below.
110
+ Delayed sends **are persisted**. The body is written to the durable mailbox at request time
111
+ with a `not_before` timestamp, so Tower keeps no timer for it and a restart inside the window
112
+ does not lose it — the re-init is delivered once the delay passes. The one thing a restart does
113
+ drop is the Ctrl+C nudge of a delayed `--interrupt`, which this cycle does not use.
114
+
115
+ That removes a failure mode this section used to warn about, but not the need for the recovery
116
+ path below: delivery still waits on an empty prompt, so a re-init can arrive late rather than
117
+ never.
112
118
 
113
119
  **If this send fails, do not end your turn.** Step 4 queued the `/clear`, but it does not
114
120
  take effect until your turn ends — so at this moment you still have your full context and