halfcycle 0.4.13 → 0.4.15

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 (79) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/bin/bin.bundle.mjs +6308 -588
  3. package/bin/pre-tool-use-filter.sh +134 -6
  4. package/commands/agent-teams-orchestration.md +1 -1
  5. package/commands/consistency-check.md +1 -1
  6. package/commands/context-update.md +1 -1
  7. package/commands/halfcycle-design.md +1 -1
  8. package/commands/halfcycle-setup.md +1 -1
  9. package/commands/stack-assembly-worker.md +1 -1
  10. package/commands/task-execution.md +1 -1
  11. package/commands/task-graph.md +1 -1
  12. package/commands/write-spec.md +1 -1
  13. package/dist/bin.d.ts +1 -0
  14. package/dist/bin.d.ts.map +1 -1
  15. package/dist/build-record/pair-io.d.ts +49 -0
  16. package/dist/build-record/pair-io.d.ts.map +1 -0
  17. package/dist/build-record/render-change.d.ts +25 -0
  18. package/dist/build-record/render-change.d.ts.map +1 -0
  19. package/dist/build-record/render-v2.d.ts +10 -5
  20. package/dist/build-record/render-v2.d.ts.map +1 -1
  21. package/dist/build-record/write-change.d.ts +63 -0
  22. package/dist/build-record/write-change.d.ts.map +1 -0
  23. package/dist/build-record/write.d.ts +5 -15
  24. package/dist/build-record/write.d.ts.map +1 -1
  25. package/dist/change.d.ts +136 -0
  26. package/dist/change.d.ts.map +1 -0
  27. package/dist/check-tasks.d.ts +71 -0
  28. package/dist/check-tasks.d.ts.map +1 -0
  29. package/dist/claude-plan.d.ts +133 -0
  30. package/dist/claude-plan.d.ts.map +1 -0
  31. package/dist/cli-contract.d.ts +12 -1
  32. package/dist/cli-contract.d.ts.map +1 -1
  33. package/dist/cli.js +9670 -4933
  34. package/dist/cli.js.map +3 -3
  35. package/dist/close-phase.d.ts +53 -1
  36. package/dist/close-phase.d.ts.map +1 -1
  37. package/dist/doctor.d.ts +34 -0
  38. package/dist/doctor.d.ts.map +1 -0
  39. package/dist/folder-refusals.d.ts +27 -0
  40. package/dist/folder-refusals.d.ts.map +1 -0
  41. package/dist/identity.d.ts +31 -1
  42. package/dist/identity.d.ts.map +1 -1
  43. package/dist/index.js +2832 -1324
  44. package/dist/index.js.map +3 -3
  45. package/dist/install-manifest.d.ts +11 -1
  46. package/dist/install-manifest.d.ts.map +1 -1
  47. package/dist/install-plan.d.ts +112 -0
  48. package/dist/install-plan.d.ts.map +1 -0
  49. package/dist/install.d.ts +593 -2
  50. package/dist/install.d.ts.map +1 -1
  51. package/dist/merge-settings.d.ts +21 -2
  52. package/dist/merge-settings.d.ts.map +1 -1
  53. package/dist/open-phase.d.ts +1 -1
  54. package/dist/open-phase.d.ts.map +1 -1
  55. package/dist/pace.d.ts +138 -0
  56. package/dist/pace.d.ts.map +1 -0
  57. package/dist/phase-work.d.ts +37 -0
  58. package/dist/phase-work.d.ts.map +1 -0
  59. package/dist/plan.d.ts +20 -4
  60. package/dist/plan.d.ts.map +1 -1
  61. package/dist/pre-create-checks.d.ts +28 -0
  62. package/dist/pre-create-checks.d.ts.map +1 -1
  63. package/dist/preview.d.ts +40 -0
  64. package/dist/preview.d.ts.map +1 -0
  65. package/dist/prove.d.ts +77 -0
  66. package/dist/prove.d.ts.map +1 -0
  67. package/dist/restore.d.ts +58 -0
  68. package/dist/restore.d.ts.map +1 -0
  69. package/dist/review.d.ts +19 -1
  70. package/dist/review.d.ts.map +1 -1
  71. package/dist/scan.d.ts +11 -0
  72. package/dist/scan.d.ts.map +1 -1
  73. package/dist/setup/discovery.d.ts.map +1 -1
  74. package/dist/setup/rows.d.ts +10 -6
  75. package/dist/setup/rows.d.ts.map +1 -1
  76. package/dist/system-report.d.ts +1 -1
  77. package/dist/system-report.d.ts.map +1 -1
  78. package/dist/uninstall.d.ts.map +1 -1
  79. package/package.json +2 -2
@@ -7,8 +7,134 @@ halfcycle_pt_skip() {
7
7
  local hc_t=${EPOCHREALTIME:-} hc_status
8
8
  [ "${BASH_VERSINFO[0]:-0}" -ge 5 ] || return 1
9
9
  case $hc_t in [0-9]*[.,][0-9][0-9][0-9]*) ;; *) return 1 ;; esac
10
+ hc_pt_live_text= hc_pt_live_sid= hc_pt_live_agent= hc_pt_live_dir=
11
+ hc_pt_own_file= hc_pt_own_agent_id= hc_pt_own_tool_use_id=
10
12
  halfcycle_pt_quiet || return 1
11
- halfcycle_pt_time_line "$hc_t"
13
+ halfcycle_pt_live || return 1
14
+ halfcycle_pt_own_copy || return 1
15
+ halfcycle_pt_own_read || return 1
16
+ halfcycle_pt_time_line "$hc_t" || return 1
17
+ halfcycle_pt_own_write "$hc_t"
18
+ return 0
19
+ }
20
+ halfcycle_pt_own_read() {
21
+ local LC_ALL=C hc_val hc_dir hc_re='^[A-Za-z0-9_-]{1,128}$'
22
+ halfcycle_pt_string tool_name || return 1
23
+ case $hc_val in
24
+ Bash|PowerShell) ;;
25
+ *) return 0 ;;
26
+ esac
27
+ halfcycle_pt_string session_id
28
+ case $? in 0) ;; 1) return 0 ;; *) return 1 ;; esac
29
+ [[ $hc_val =~ $hc_re ]] || return 0
30
+ hc_dir=${TMPDIR:-/tmp}
31
+ while [ "${hc_dir%/}" != "$hc_dir" ]; do hc_dir=${hc_dir%/}; done
32
+ hc_pt_own_file=$hc_dir/halfcycle-own-$hc_val.jsonl
33
+ halfcycle_pt_optional 'agent_id' || return 1
34
+ hc_pt_own_agent_id=$hc_val
35
+ halfcycle_pt_optional 'tool_use_id' || return 1
36
+ hc_pt_own_tool_use_id=$hc_val
37
+ return 0
38
+ }
39
+ halfcycle_pt_own_write() {
40
+ local LC_ALL=C hc_at hc_line
41
+ [ -n "$hc_pt_own_file" ] || return 0
42
+ halfcycle_pt_stamp "$1" || return 0
43
+ printf -v hc_line '{"at":"%s","kind":"shell","agent":%s,"toolUse":%s}' "$hc_at" "$hc_pt_own_agent_id" "$hc_pt_own_tool_use_id" || return 0
44
+ umask 077
45
+ { printf '%s\n' "$hc_line" >> "$hc_pt_own_file"; } 2>/dev/null
46
+ return 0
47
+ }
48
+ halfcycle_pt_stamp() {
49
+ local hc_secs hc_frac
50
+ hc_secs=${1%%[.,]*}
51
+ hc_frac=${1#*[.,]}
52
+ TZ=UTC0 printf -v hc_at '%(%Y-%m-%dT%H:%M:%S)T' "$hc_secs" || return 1
53
+ hc_at=$hc_at.${hc_frac:0:3}Z
54
+ }
55
+ halfcycle_pt_live() {
56
+ local LC_ALL=C hc_val hc_sid hc_agent= hc_cwd hc_dir hc_file hc_text= hc_ng=0 hc_re='^[A-Za-z0-9_-]{1,128}$'
57
+ local -a hc_files
58
+ halfcycle_pt_string session_id
59
+ case $? in 0) hc_sid=$hc_val ;; 1) return 0 ;; *) return 1 ;; esac
60
+ [[ $hc_sid =~ $hc_re ]] || return 0
61
+ halfcycle_pt_string agent_id
62
+ case $? in 0) hc_agent=$hc_val ;; 1) ;; *) return 1 ;; esac
63
+ if [ -n "$hc_agent" ]; then
64
+ [[ $hc_agent =~ $hc_re ]] || return 0
65
+ hc_agent=-$hc_agent
66
+ fi
67
+ halfcycle_pt_string cwd
68
+ case $? in 0) hc_cwd=$hc_val ;; 1) return 0 ;; *) return 1 ;; esac
69
+ [ -n "$hc_cwd" ] || return 0
70
+ case $hc_cwd in *'\'*|*[$'\n\r']*) return 1 ;; esac
71
+ hc_dir=${TMPDIR:-/tmp}
72
+ while [ "${hc_dir%/}" != "$hc_dir" ]; do hc_dir=${hc_dir%/}; done
73
+ shopt -q nullglob && hc_ng=1
74
+ shopt -s nullglob
75
+ hc_files=("$hc_dir"/halfcycle-live-"$hc_sid"/halfcycle-session-[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z]-"$hc_sid".live"$hc_agent")
76
+ [ "$hc_ng" = 1 ] || shopt -u nullglob
77
+ [ "${#hc_files[@]}" -eq 1 ] || return 1
78
+ hc_file=$hc_dir/${hc_files[0]##*/}
79
+ IFS= read -r -d '' hc_text < "$hc_file" 2>/dev/null
80
+ [ "${hc_text%%$'\n'*}" = "$hc_cwd" ] || return 1
81
+ { printf '%s' "$hc_text" > "$hc_file"; } 2>/dev/null || return 1
82
+ hc_pt_live_text=$hc_text hc_pt_live_sid=$hc_sid hc_pt_live_agent=${hc_agent#-} hc_pt_live_dir=$hc_dir
83
+ return 0
84
+ }
85
+ halfcycle_pt_own_copy() {
86
+ local LC_ALL=C hc_val hc_top hc_rest hc_d hc_f hc_text= hc_ng=0 hc_others=0
87
+ local -a hc_files
88
+ halfcycle_pt_string tool_name || return 1
89
+ case $hc_val in
90
+ Write|Edit|MultiEdit) ;;
91
+ *) return 0 ;;
92
+ esac
93
+ halfcycle_pt_string file_path || return 1
94
+ case $hc_val in /*) ;; *) return 1 ;; esac
95
+ case $hc_val in *'\'*|*[$'\n\r']*) return 1 ;; esac
96
+ hc_rest=${hc_pt_live_text#*$'\n'}
97
+ hc_top=${hc_rest%%$'\n'*}
98
+ case $hc_top in /?*) ;; *) return 1 ;; esac
99
+ shopt -q nullglob && hc_ng=1
100
+ shopt -s nullglob
101
+ hc_files=("$hc_pt_live_dir"/halfcycle-live-"$hc_pt_live_sid"/halfcycle-session-[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z]-"$hc_pt_live_sid".live-*)
102
+ [ "$hc_ng" = 1 ] || shopt -u nullglob
103
+ for hc_f in "${hc_files[@]}"; do
104
+ if [ -n "$hc_pt_live_agent" ]; then
105
+ case $hc_f in *.live-"$hc_pt_live_agent") continue ;; esac
106
+ fi
107
+ hc_others=1
108
+ done
109
+ case $hc_val in
110
+ "$hc_top"/?*) ;;
111
+ *) [ -z "$hc_pt_live_agent" ] && [ "$hc_others" = 0 ] && return 0; return 1 ;;
112
+ esac
113
+ hc_rest=${hc_val#"$hc_top"/}
114
+ case /$hc_rest/ in *//*|*/./*|*/../*) return 1 ;; esac
115
+ hc_d=$hc_top
116
+ while :; do
117
+ case $hc_rest in */*) ;; *) break ;; esac
118
+ hc_d=$hc_d/${hc_rest%%/*}
119
+ hc_rest=${hc_rest#*/}
120
+ [ -h "$hc_d" ] && return 1
121
+ [ -d "$hc_d" ] || break
122
+ { [ -e "$hc_d/.git" ] || [ -h "$hc_d/.git" ]; } && return 1
123
+ done
124
+ [ -z "$hc_pt_live_agent" ] && return 0
125
+ [ "$hc_others" = 0 ] && return 0
126
+ shopt -q nullglob && hc_ng=1
127
+ shopt -s nullglob
128
+ hc_files=("$hc_pt_live_dir"/halfcycle-live-"$hc_pt_live_sid"/halfcycle-session-[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z]-"$hc_pt_live_sid".live)
129
+ [ "$hc_ng" = 1 ] || shopt -u nullglob
130
+ [ "${#hc_files[@]}" -eq 1 ] || return 1
131
+ IFS= read -r -d '' hc_text < "$hc_pt_live_dir/${hc_files[0]##*/}" 2>/dev/null
132
+ case $hc_text in *$'\n'*$'\n'*) ;; *) return 1 ;; esac
133
+ hc_text=${hc_text#*$'\n'}
134
+ hc_text=${hc_text%%$'\n'*}
135
+ [ -n "$hc_text" ] || return 1
136
+ [ "$hc_text" = "$hc_top" ] && return 1
137
+ return 0
12
138
  }
13
139
  halfcycle_pt_quiet() {
14
140
  local LC_ALL=C hc_status hc_ext=0
@@ -29,7 +155,6 @@ halfcycle_pt_quiet_input() {
29
155
  case $hc_input in *'"tool_input":{'*) ;; *) return 1 ;; esac
30
156
  halfcycle_pt_once '"tool_input"' || return 1
31
157
  case $hc_tool in
32
- NotebookEdit|Agent) return 0 ;;
33
158
  Bash)
34
159
  halfcycle_pt_string command
35
160
  case $? in 1) return 0 ;; 2) return 1 ;; esac
@@ -225,6 +350,7 @@ halfcycle_pt_records() {
225
350
  halfcycle_pt_holds 'features' $'f?(\x01)e?(\x01)a?(\x01)t?(\x01)u?(\x01)r?(\x01)e?(\x01)s' && return 1
226
351
  halfcycle_pt_holds 'decisions' $'d?(\x01)e?(\x01)c?(\x01)i?(\x01)s?(\x01)i?(\x01)o?(\x01)n?(\x01)s' && return 1
227
352
  halfcycle_pt_holds 'build-tasks.json' $'b?(\x01)u?(\x01)i?(\x01)l?(\x01)d?(\x01)-?(\x01)t?(\x01)a?(\x01)s?(\x01)k?(\x01)s?(\x01).?(\x01)j?(\x01)s?(\x01)o?(\x01)n' && return 1
353
+ halfcycle_pt_holds 'task-plan.json' $'t?(\x01)a?(\x01)s?(\x01)k?(\x01)-?(\x01)p?(\x01)l?(\x01)a?(\x01)n?(\x01).?(\x01)j?(\x01)s?(\x01)o?(\x01)n' && return 1
228
354
  halfcycle_pt_holds 'build-records' $'b?(\x01)u?(\x01)i?(\x01)l?(\x01)d?(\x01)-?(\x01)r?(\x01)e?(\x01)c?(\x01)o?(\x01)r?(\x01)d?(\x01)s' && return 1
229
355
  halfcycle_pt_holds '.claude' $'.?(\x01)c?(\x01)l?(\x01)a?(\x01)u?(\x01)d?(\x01)e' && return 1
230
356
  return 0
@@ -286,6 +412,11 @@ halfcycle_pt_branch() {
286
412
  local hc_dir hc_dotgit hc_gitdir hc_text hc_line hc_ptr hc_path
287
413
  hc_branch=null
288
414
  case $1 in /*) ;; *) return 0 ;; esac
415
+ hc_dir=$1
416
+ while [ -n "$hc_dir" ] && [ "$hc_dir" != / ]; do
417
+ [ -L "$hc_dir" ] && return 1
418
+ hc_dir=${hc_dir%/*}
419
+ done
289
420
  halfcycle_pt_resolve "$1"
290
421
  hc_dir=$hc_path
291
422
  [ -d "$hc_dir" ] || return 0
@@ -364,10 +495,7 @@ halfcycle_pt_time_line() {
364
495
  case $hc_folder in *[$'\x01'-$'\x1f']*|*'\'*|*'"'*) return 1 ;; esac
365
496
  fi
366
497
  halfcycle_pt_branch "$hc_folder" || return 1
367
- hc_secs=${1%%[.,]*}
368
- hc_frac=${1#*[.,]}
369
- TZ=UTC0 printf -v hc_at '%(%Y-%m-%dT%H:%M:%S)T' "$hc_secs" || return 1
370
- hc_at=$hc_at.${hc_frac:0:3}Z
498
+ halfcycle_pt_stamp "$1" || return 1
371
499
  printf -v hc_line '{"at":"%s","event":"action","session":%s,"agent":%s,"folder":"%s","branch":%s,"transcript":%s,"toolUse":%s}' "$hc_at" "$hc_f_session_id" "$hc_f_agent_id" "$hc_folder" "$hc_branch" "$hc_f_transcript_path" "$hc_f_tool_use_id"
372
500
  hc_dir=$hc_home/.halfcycle/engagements/$hc_id/time-log
373
501
  umask 077
@@ -2,7 +2,7 @@
2
2
  description: Take a plan that already exists and drive ALL of it through to done across several workers at once, rather than handing out the pieces one at a time
3
3
  ---
4
4
 
5
- Resolve `/agent-teams-orchestration` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and give a short phrase they can say to start it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
5
+ Resolve `/agent-teams-orchestration` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and offer to start it, as a question, and start it when they say yes; where only the owner can give an approval, say so plainly and say how they give it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
6
 
7
7
  If resolution fails, report exactly this and stop:
8
8
 
@@ -2,7 +2,7 @@
2
2
  description: Check a drafted feature spec against the invariants and its adjacent specs, from a session that did not write it
3
3
  ---
4
4
 
5
- Resolve `/consistency-check` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and give a short phrase they can say to start it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
5
+ Resolve `/consistency-check` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and offer to start it, as a question, and start it when they say yes; where only the owner can give an approval, say so plainly and say how they give it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
6
 
7
7
  If resolution fails, report exactly this and stop:
8
8
 
@@ -2,7 +2,7 @@
2
2
  description: Route recent changes into the repo's context surfaces
3
3
  ---
4
4
 
5
- Resolve `/context-update` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and give a short phrase they can say to start it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
5
+ Resolve `/context-update` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and offer to start it, as a question, and start it when they say yes; where only the owner can give an approval, say so plainly and say how they give it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
6
 
7
7
  If resolution fails, report exactly this and stop:
8
8
 
@@ -2,7 +2,7 @@
2
2
  description: Work out what the product is — the design journey to a PRD and phases
3
3
  ---
4
4
 
5
- Resolve `/halfcycle-design` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and give a short phrase they can say to start it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
5
+ Resolve `/halfcycle-design` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and offer to start it, as a question, and start it when they say yes; where only the owner can give an approval, say so plainly and say how they give it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
6
 
7
7
  If resolution fails, report exactly this and stop:
8
8
 
@@ -2,7 +2,7 @@
2
2
  description: Set up a repository for a Halfcycle engagement
3
3
  ---
4
4
 
5
- Resolve `/halfcycle-setup` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and give a short phrase they can say to start it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
5
+ Resolve `/halfcycle-setup` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and offer to start it, as a question, and start it when they say yes; where only the owner can give an approval, say so plainly and say how they give it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
6
 
7
7
  If resolution fails, report whichever applies and stop:
8
8
 
@@ -2,7 +2,7 @@
2
2
  description: Verify a phase's assembled stack comes up end to end
3
3
  ---
4
4
 
5
- Resolve `/stack-assembly-worker` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and give a short phrase they can say to start it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
5
+ Resolve `/stack-assembly-worker` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and offer to start it, as a question, and start it when they say yes; where only the owner can give an approval, say so plainly and say how they give it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
6
 
7
7
  If resolution fails, report exactly this and stop:
8
8
 
@@ -2,7 +2,7 @@
2
2
  description: Do ONE piece of the planned work, on its own — not the whole plan
3
3
  ---
4
4
 
5
- Resolve `/task-execution` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and give a short phrase they can say to start it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
5
+ Resolve `/task-execution` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and offer to start it, as a question, and start it when they say yes; where only the owner can give an approval, say so plainly and say how they give it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
6
 
7
7
  If resolution fails, report exactly this and stop:
8
8
 
@@ -2,7 +2,7 @@
2
2
  description: Break the next chunk of work into ordered pieces that can be handed out — what has to happen before what, and who could take each
3
3
  ---
4
4
 
5
- Resolve `/task-graph` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and give a short phrase they can say to start it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
5
+ Resolve `/task-graph` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and offer to start it, as a question, and start it when they say yes; where only the owner can give an approval, say so plainly and say how they give it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
6
 
7
7
  If resolution fails, report exactly this and stop:
8
8
 
@@ -2,7 +2,7 @@
2
2
  description: Draft a Layer 4 feature spec
3
3
  ---
4
4
 
5
- Resolve `/write-spec` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and give a short phrase they can say to start it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
5
+ Resolve `/write-spec` for this engagement's current state, execute what comes back, report that the step ran, and resolve again — repeating until the response says there is nothing left (`hasNextStep` false); pausing for a human answer is not the end of the run. Do not improvise the procedure. Say where things stand at the boundaries of the run — when it starts, when it moves to a new layer, and when it ends — rather than on every turn, and pause only where a step asks you to. At one of those boundaries, and at most once per run, point them at this project's own page on the web and say what is there: how the project is going, the agents working on it once there are any, and their other projects alongside it. Use the address this install already records for the project's page rather than building one from an example, and give them the address itself — a page they are told about but cannot reach is worse than not mentioning it. Some steps of the Halfcycle method are judged by Halfcycle rather than by this session, or need a person to do something outside this session, so a quiet run is not a claim that nothing was due — say so when a run ends. Everything you say to the person is in plain words. Name the Halfcycle method the first time and say what it is in the same breath — the process that will guide the two of you through building this — because bare "the method" means nothing to someone who has not met it. After that, talk about their product and never about how any of this works underneath: no paths or files of ours, no hooks, settings, commands, layers or step ids. Name a stage by its step's name, the professional's term spelled out, then say plainly what it means and offer to start it, as a question, and start it when they say yes; where only the owner can give an approval, say so plainly and say how they give it, and never Halfcycle's own machinery as the subject of a sentence. Say what now exists, what it is for, and what you need from them, in their terms. The one thing you never soften and never leave out is what did NOT happen — say that plainly too. If you are asked to jump ahead: when that is what comes next anyway, just do it; when Halfcycle refuses, relay its reason word for word and invent no procedure of your own; when it can be served but skips something, do it and say what is being skipped and what that costs. Coming back later is fine — a fresh session re-orients from what this project has recorded, so ask to carry on in plain words and you get the right next step and where things stand.
6
6
 
7
7
  If resolution fails, report exactly this and stop:
8
8
 
package/dist/bin.d.ts CHANGED
@@ -15,6 +15,7 @@
15
15
  * halfcycle draw architecture|phase <phase> — draw the architecture or a phase's pictures into docs/diagrams (`draw/`)
16
16
  * halfcycle plan <phase> [--show] — check a phase's plan and report it; list it (`plan.ts`)
17
17
  * halfcycle review <phase> --show | --answer <part> "…" — list a phase's close review; answer a question (`review.ts`)
18
+ * halfcycle prove <phase> <task> --label "…" (--before|--after) [-- <cmd>] — run a check once on this machine and record what it saw (`prove.ts`)
18
19
  * halfcycle uninstall [--remove-credential] — take back what the installer wrote here
19
20
  *
20
21
  * NO `ci` VERB (T-25, operator decision 2026-09-22(c)) — `ci bind`/`ci unbind`
package/dist/bin.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG"}
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The file discipline every record-pair writer shares: exclusive create, the
3
+ * write-then-rename replace, and the no-half-pair create of a `.json` beside its `.md`.
4
+ *
5
+ * ONE COPY FOR TWO WRITERS. A phase's Build Record (`write.ts`, `writeRecordPair`) and
6
+ * a small change's record (`write-change.ts`, `writeChangeRecordPair`) write their pairs
7
+ * through these helpers, and `draw`'s three-file writer goes through the same seam, so
8
+ * there is one exclusive-create on disk, not one per writer. What each writer decides
9
+ * for itself is only what to do when a file is already in the way: the phase writer may
10
+ * replace its own earlier record, the small-change writer, whose record is write-once,
11
+ * never replaces.
12
+ *
13
+ * Nothing here builds a path. Every caller composes and checks its own paths before it
14
+ * hands them over (INV-023).
15
+ */
16
+ /**
17
+ * The file operations a pair writer makes, behind one seam so a test can make
18
+ * the SECOND write fail and watch the first come back out. `createExclusive` opens
19
+ * with `wx` (never truncates an existing file) and removes what it created if the
20
+ * write itself fails; `rename` replaces in one step on the same filesystem.
21
+ *
22
+ * ONE SEAM FOR TEXT AND BYTES. `draw`'s three-file writer (`../draw/write.ts`) goes
23
+ * through this same seam with a PNG's bytes, so a string is written as UTF-8 and a
24
+ * byte array as itself.
25
+ */
26
+ export interface RecordPairIo {
27
+ createExclusive(path: string, data: string | Uint8Array): void;
28
+ rename(from: string, to: string): void;
29
+ }
30
+ export declare const NODE_RECORD_PAIR_IO: RecordPairIo;
31
+ /** Serialise a served record for the `.json`: 2-space indent, trailing newline. */
32
+ export declare function serialiseServedRecord(rawRecord: unknown): string;
33
+ /** Is `err` the file system saying the file is already there? */
34
+ export declare function isEexist(err: unknown): boolean;
35
+ /** The text at `path`, or `null` when it cannot be read as a file. */
36
+ export declare function readIfPresent(path: string): string | null;
37
+ /**
38
+ * Create both files of a pair exclusively, `.json` first. `created`: both are down.
39
+ * `exists`: one of the two was already there, and nothing this call created is left
40
+ * behind (a `.json` it created is removed again), so the caller's own replace rule
41
+ * decides from a clean state. Any other failure is thrown, with nothing left behind.
42
+ */
43
+ export declare function createPairExclusive(io: RecordPairIo, jsonPath: string, jsonText: string, mdPath: string, mdText: string): 'created' | 'exists';
44
+ /**
45
+ * Write `text` to `tmp` and rename it over `finalPath`. A `.tmp` left by an earlier
46
+ * crash is removed first and never read. On failure the temporary file is removed.
47
+ */
48
+ export declare function replaceOne(io: RecordPairIo, tmp: string, finalPath: string, text: string): void;
49
+ //# sourceMappingURL=pair-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pair-io.d.ts","sourceRoot":"","sources":["../../src/build-record/pair-io.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IAC/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AA2BD,eAAO,MAAM,mBAAmB,EAAE,YAGjC,CAAC;AAEF,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAEhE;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAE9C;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMzD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,YAAY,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,SAAS,GAAG,QAAQ,CAYtB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAS/F"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The Markdown half of a small change's record pair (feature `three-paths`, *The
3
+ * writer*): `renderChangeRecordMarkdown` turns a frozen `smallChangeRecordSchema` value
4
+ * into the `.md` written beside its `.json` under `docs/build-records/changes/`.
5
+ *
6
+ * A SMALL CHANGE IS NOT A PHASE, and its record never reads as one: no line here says
7
+ * approved, unapproved, or asks for an approval (three-paths AC6, INV-024). A small
8
+ * change carries no approval to give or to lack, so the words never appear.
9
+ *
10
+ * WHOSE WORDS ARE WHOSE (INV-025). What Halfcycle counted is under "What Halfcycle
11
+ * saw"; the agent's one line, a reviewer's finding, a diagnosis and a call are each
12
+ * marked as the agent's own. A change that ended without a count (stopped, or moved up
13
+ * by the person) says Halfcycle did not count it, never that nothing changed. A window
14
+ * with no recorded check run reads as not observed, never as nothing found (INV-021).
15
+ *
16
+ * Every string from the record is printed through the Build Record renderer's own
17
+ * escapers (`printRecordText` for a slot with a line of its own, `printStrictText` for
18
+ * a slot sharing a line), so record text cannot become markup. One home for that rule.
19
+ *
20
+ * SHIPS TO CLIENT DISK inside the CLI: no comment sits beside an object member.
21
+ */
22
+ import type { SmallChangeRecord } from '@halfcycle/events';
23
+ /** The `.md` of a small change's record. Pure: the same record renders the same text. */
24
+ export declare function renderChangeRecordMarkdown(record: SmallChangeRecord): string;
25
+ //# sourceMappingURL=render-change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-change.d.ts","sourceRoot":"","sources":["../../src/build-record/render-change.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAsH3D,yFAAyF;AACzF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA4C5E"}
@@ -16,10 +16,12 @@
16
16
  * bytes, whatever key order a database hands back.
17
17
  *
18
18
  * IT DOES NOT PARSE. The caller parses the record first; the type here is the
19
- * contract's own inferred type. Two of the contract's functions are imported at
19
+ * contract's own inferred type. Four of the contract's functions are imported at
20
20
  * runtime, because each is the one home of what it composes: `codeLinkLine`, the
21
- * code line every reader prints for a part, and `removalsOf`, the parts a closed
22
- * review leaves to take out of the system description. Neither is restated here.
21
+ * code line every reader prints for a part; `removalsOf`, the parts a closed
22
+ * review leaves to take out of the system description; `hasOwnerReview`, whether a
23
+ * record kept the owner's review (v3 and v4 did, v2 did not); and `keptPathOf`, the
24
+ * phase's path a v4 record kept. None is restated here, and no format is compared.
23
25
  * The one cross-half rule it relies
24
26
  * on — both halves describe the same closes, paired by `sequence` — it checks
25
27
  * itself and throws on, because printing a close without its other half would
@@ -77,8 +79,11 @@ export declare function latestCloseHeadline(record: BuildRecord): string;
77
79
  * learned an earlier round said something else).
78
80
  *
79
81
  * Render a parsed Build Record as markdown: v2's observed and attested halves, which
80
- * a v3 record carries unchanged, and for a v3 record the owner's review after the
81
- * latest close (RM1–RM3, feature `close-review-and-carry-drop`).
82
+ * a v3 or v4 record carries unchanged; for a v4 record its path; for a v3 or v4
83
+ * record the owner's review after the latest close (RM1–RM3, feature
84
+ * `close-review-and-carry-drop`); and for a v4 record alone the calls made without asking
85
+ * (C1–C5) and the owner's answers to checks Halfcycle never ran, after the review. An
86
+ * older record prints neither section, so its Markdown is unchanged.
82
87
  *
83
88
  * Throws, in client words, if the two halves describe different closes — which a
84
89
  * parsed record cannot do. Output uses `\n` only and ends in exactly one `\n`.
@@ -1 +1 @@
1
- {"version":3,"file":"render-v2.d.ts","sourceRoot":"","sources":["../../src/build-record/render-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAGL,KAAK,WAAW,EAKjB,MAAM,mBAAmB,CAAC;AA8J3B;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAepD;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASpD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOvD;AAgMD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAO/D;AAmRD;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAyEvE"}
1
+ {"version":3,"file":"render-v2.d.ts","sourceRoot":"","sources":["../../src/build-record/render-v2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAmBL,KAAK,WAAW,EAQjB,MAAM,mBAAmB,CAAC;AA8J3B;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAepD;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASpD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOvD;AA2MD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAO/D;AAwVD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAgFvE"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The small-change record pair writer (feature `three-paths`, *The writer*).
3
+ *
4
+ * A small change's record is not a phase's Build Record, so it never goes through
5
+ * `writeRecordPair`: it has its own folder, `docs/build-records/changes/`, its own
6
+ * renderer (`render-change.ts`) and a narrower replace rule.
7
+ *
8
+ * THE FILENAME COMES FROM THE CALLER'S `sortingId` ARGUMENT, never from the record
9
+ * (INV-023). The argument is checked as a UUID (`sortingIdSchema`, the contracts' one
10
+ * home of a change id) here, where every caller converges, before any path is made,
11
+ * so the CLI's own check is not the only one. `record.sortingId` is never read for a
12
+ * path: a record naming another change, or `../x`, still lands at the argument's name.
13
+ * After the join, every path, temporary ones included, is checked to be a plain file
14
+ * directly inside the folder, comparing two operands that move independently: the
15
+ * folder (from `repoRoot` and a constant) and the candidate (from the argument).
16
+ *
17
+ * WRITE-ONCE, SO NEVER REPLACED. The service freezes a small change's record once, so
18
+ * the same `.json` bytes already there are up to date (the `.md` is rendered again,
19
+ * so a renderer change never refuses the CLI's own pair), and anything else in the way
20
+ * is refused, naming the file. The exclusive create and the no-half-pair rule are the
21
+ * shared ones in `pair-io.ts`.
22
+ *
23
+ * All-or-nothing: the id is checked, every path asserted and both texts rendered
24
+ * before the folder is made or the first file created.
25
+ */
26
+ import { type SmallChangeRecord } from '@halfcycle/events';
27
+ import { type RecordPairIo } from './pair-io.js';
28
+ /** The one output folder for small-change records, relative to the project root. */
29
+ export declare const CHANGE_RECORD_DIR: string;
30
+ /** A change id that cannot name a record file: refused before any path is made. */
31
+ export declare class InvalidChangeIdError extends Error {
32
+ readonly id: unknown;
33
+ constructor(id: unknown);
34
+ }
35
+ /**
36
+ * Assert that a joined path is still a plain file directly inside `outDir`. Exported
37
+ * so a test can hand it a candidate outside the folder: no id that passes the UUID
38
+ * check can produce one, so only a direct call can tell this guard from a deleted one.
39
+ */
40
+ export declare function assertInsideChangeDir(outDir: string, candidate: string, id: unknown): void;
41
+ /**
42
+ * What `writeChangeRecordPair` did. `created`: neither file existed. `up-to-date`: the
43
+ * `.json` already held these exact bytes, and the `.md` was rendered again.
44
+ * `in-the-way`: something else is at one of the two paths; nothing was written and
45
+ * `path` names it.
46
+ */
47
+ export type ChangeRecordPairResult = {
48
+ kind: 'created' | 'up-to-date';
49
+ jsonPath: string;
50
+ mdPath: string;
51
+ } | {
52
+ kind: 'in-the-way';
53
+ path: string;
54
+ };
55
+ /**
56
+ * Write a small change's record pair into `docs/build-records/changes/`: the `.json`
57
+ * as the service sent it, the `.md` rendered from the parsed record.
58
+ *
59
+ * @throws InvalidChangeIdError when `sortingId` is not a change id.
60
+ * @throws the file system's own error when a write fails; nothing is left behind.
61
+ */
62
+ export declare function writeChangeRecordPair(repoRoot: string, sortingId: string, rawRecord: unknown, record: SmallChangeRecord, io?: RecordPairIo): ChangeRecordPairResult;
63
+ //# sourceMappingURL=write-change.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-change.d.ts","sourceRoot":"","sources":["../../src/build-record/write-change.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,QAA2C,CAAC;AAE1E,mFAAmF;AACnF,qBAAa,oBAAqB,SAAQ,KAAK;IACjC,QAAQ,CAAC,EAAE,EAAE,OAAO;gBAAX,EAAE,EAAE,OAAO;CAIjC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,CAI1F;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,SAAS,GAAG,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,iBAAiB,EACzB,EAAE,GAAE,YAAkC,GACrC,sBAAsB,CA0BxB"}
@@ -25,6 +25,7 @@
25
25
  * before the `mkdirSync` and the first create, so a refused record leaves no file
26
26
  * and no empty directory behind.
27
27
  */
28
+ import { NODE_RECORD_PAIR_IO, serialiseServedRecord, type RecordPairIo } from './pair-io.js';
28
29
  import { type BuildRecord } from '@halfcycle/events';
29
30
  /** The one and only output directory (relative to the target repo root). */
30
31
  export declare const BUILD_RECORD_DIR: string;
@@ -43,20 +44,11 @@ export declare const BUILD_RECORD_DIR: string;
43
44
  */
44
45
  export declare function assertInsideOutDir(outDir: string, candidate: string, identity: unknown): void;
45
46
  /**
46
- * The file operations `writeRecordPair` makes, behind one seam so a test can make
47
- * the SECOND write fail and watch the first come back out. `createExclusive` opens
48
- * with `wx` (never truncates an existing file) and removes what it created if the
49
- * write itself fails; `rename` replaces in one step on the same filesystem.
50
- *
51
- * ONE SEAM FOR TEXT AND BYTES. `draw`'s three-file writer (`../draw/write.ts`) goes
52
- * through this same seam with a PNG's bytes, so a string is written as UTF-8 and a
53
- * byte array as itself, and there is one exclusive-create on disk, not two.
47
+ * The shared file discipline (`pair-io.ts`): one exclusive-create, one replace and one
48
+ * no-half-pair create for this writer and the small-change writer. Re-exported so the
49
+ * callers that have always imported them from here keep doing so.
54
50
  */
55
- export interface RecordPairIo {
56
- createExclusive(path: string, data: string | Uint8Array): void;
57
- rename(from: string, to: string): void;
58
- }
59
- export declare const NODE_RECORD_PAIR_IO: RecordPairIo;
51
+ export { NODE_RECORD_PAIR_IO, serialiseServedRecord, type RecordPairIo };
60
52
  /**
61
53
  * What `writeRecordPair` did. `created`: neither file existed. `up-to-date`: the
62
54
  * `.json` already held these exact bytes, and the `.md` was rendered again.
@@ -72,8 +64,6 @@ export type RecordPairResult = {
72
64
  kind: 'in-the-way';
73
65
  path: string;
74
66
  };
75
- /** Serialise a served record for the `.json`: 2-space indent, trailing newline. */
76
- export declare function serialiseServedRecord(rawRecord: unknown): string;
77
67
  /**
78
68
  * Write a phase's Build Record pair into `docs/build-records/`: the `.json` as the
79
69
  * service sent it, and the `.md` rendered from the parsed record.
@@ -1 +1 @@
1
- {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/build-record/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAcH,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAE3B,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,QAAgC,CAAC;AAE9D;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAM7F;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IAC/D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AA2BD,eAAO,MAAM,mBAAmB,EAAE,YAGjC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAEhE;AA0CD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,WAAW,EACnB,EAAE,GAAE,YAAkC,GACrC,gBAAgB,CAyDlB"}
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/build-record/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,OAAO,EACL,mBAAmB,EAInB,qBAAqB,EACrB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAE3B,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,QAAgC,CAAC;AAE9D;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAM7F;AAED;;;;GAIG;AACH,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,KAAK,YAAY,EAAE,CAAC;AAEzE;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA8BzC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,WAAW,EACnB,EAAE,GAAE,YAAkC,GACrC,gBAAgB,CAkDlB"}