odd-studio 3.7.1 → 3.7.4

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.
@@ -12,17 +12,13 @@
12
12
  # swarm-write Write|Edit — blocks source writes without swarm + agent token
13
13
  # verify-gate Edit|Write — blocks marking outcomes verified without checklist
14
14
  # confirm-gate Edit|Write — blocks briefConfirmed without odd-flow store
15
- # checkpoint-gate Bash — blocks commits until a fresh Checkpoint scan clears the latest source changes
16
- # commit-gate Bash — blocks git commit without odd-flow state stored
17
15
  #
18
16
  # PostToolUse (exit 0 + stderr = coaching):
19
- # session-save Bash — auto-save state after git commit
20
- # state-dirty-mark Write|Edit marks state.json edits as needing odd-flow store
21
- # store-validate mcp__odd-flow__memory_storecreates ready marker
22
- # sync-validate mcp__odd-flow__coordination_sync — creates agents-ready marker
17
+ # session-save Bash — updates last-commit metadata after git commit
18
+ # store-validate mcp__odd-flow__memory_storetouches brief-stored marker
19
+ # sync-validate mcp__odd-flow__coordination_syncactivates swarm markers
23
20
  # code-quality Write|Edit — code elegance check
24
- # security-quality Write|Edit — security baseline check + checkpoint dirty marker
25
- # checkpoint-validate Bash — marks checkpoint clear after a successful scan
21
+ # security-quality Write|Edit — security baseline warnings (non-blocking)
26
22
  # brief-quality Write — session brief quality check
27
23
  # outcome-quality Write — outcome/persona quality check
28
24
  #
@@ -86,7 +82,7 @@ is_source_file() {
86
82
  return 1
87
83
  fi
88
84
  # Non-source locations — allow
89
- if echo "$fp" | grep -qE '(\.odd/|docs/|memory/|MEMORY\.md|CLAUDE\.md|\.odd-flow)'; then
85
+ if echo "$fp" | grep -qE '(\.odd/|docs/|memory/|MEMORY\.md|CLAUDE\.md|\.odd-flow|\.claude/)'; then
90
86
  return 1
91
87
  fi
92
88
  # Hook/skill/script files — allow
@@ -230,11 +226,7 @@ verify-gate)
230
226
  exit 2
231
227
  fi
232
228
 
233
- if [ -f ".odd/.checkpoint-dirty" ] || [ ! -f ".odd/.checkpoint-clear" ]; then
234
- echo "ODD STUDIO [verify-gate]: Verification blocked — a fresh Checkpoint scan has not cleared the latest source changes." >&2
235
- echo "Run: npx @darrenjcoxon/vibeguard --security-only -o json" >&2
236
- exit 2
237
- fi
229
+ # Checkpoint pre-check removed in v3.7.3 (see checkpoint-gate note below).
238
230
 
239
231
  VERIFIED_CONFIRMED=$(get_state_field "verificationConfirmed")
240
232
  if [ "$VERIFIED_CONFIRMED" != "true" ]; then
@@ -246,27 +238,12 @@ verify-gate)
246
238
  ;;
247
239
 
248
240
  # ─────────────────────────────────────────────────────────────────────────────
249
- # PreToolUse: Bash blocks commit while checkpoint is dirty
241
+ # checkpoint-gateREMOVED in v3.7.3
242
+ # Vibeguard/Checkpoint was treating dependency-lockfile CVEs as equivalent to
243
+ # code vulnerabilities, making every commit impossible while any transitive
244
+ # dep had an open advisory. Re-introduce only with a scoped scanner that
245
+ # ignores lockfile-only findings.
250
246
  # ─────────────────────────────────────────────────────────────────────────────
251
- checkpoint-gate)
252
- [ "$TOOL_NAME" = "Bash" ] || exit 0
253
- [ "$CURRENT_PHASE" = "build" ] || exit 0
254
- COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
255
- echo "$COMMAND" | grep -qE 'git\s+commit' || exit 0
256
-
257
- if [ "$BUILD_MODE" = "debug" ]; then
258
- echo "ODD STUDIO [checkpoint-gate]: Commit blocked — debug mode is active." >&2
259
- echo "Resolve the failure, return to verify mode, then commit only after verification passes." >&2
260
- exit 2
261
- fi
262
-
263
- if [ -f ".odd/.checkpoint-dirty" ] || [ ! -f ".odd/.checkpoint-clear" ]; then
264
- echo "ODD STUDIO [checkpoint-gate]: Commit blocked — latest source changes have not passed Checkpoint." >&2
265
- echo "Run: npx @darrenjcoxon/vibeguard --security-only -o json" >&2
266
- exit 2
267
- fi
268
- exit 0
269
- ;;
270
247
 
271
248
  # ─────────────────────────────────────────────────────────────────────────────
272
249
  # PreToolUse: Edit|Write — blocks briefConfirmed without odd-flow store
@@ -279,7 +256,7 @@ confirm-gate)
279
256
  NEW_CONTENT=$(echo "$INPUT" | jq -r '.tool_input.new_string // .tool_input.content // empty')
280
257
  echo "$NEW_CONTENT" | grep -qE '"briefConfirmed"\s*:\s*true' || exit 0
281
258
 
282
- if [ ! -f ".odd/.odd-flow-brief-stored" ] && [ ! -f ".odd/.odd-flow-state-ready" ]; then
259
+ if [ ! -f ".odd/.odd-flow-brief-stored" ]; then
283
260
  echo "ODD STUDIO [confirm-gate]: Brief not stored in odd-flow memory. Store it first." >&2
284
261
  exit 2
285
262
  fi
@@ -287,26 +264,12 @@ confirm-gate)
287
264
  ;;
288
265
 
289
266
  # ─────────────────────────────────────────────────────────────────────────────
290
- # PreToolUse: Bash blocks git commit without odd-flow state stored
267
+ # commit-gateREMOVED in v3.7.4
268
+ # The dirty/ready marker treadmill was creating more friction than value.
269
+ # State persistence to odd-flow is now the orchestrator's responsibility at
270
+ # genuine persistence points (session end, outcome verified) rather than a
271
+ # hard-block on every commit.
291
272
  # ─────────────────────────────────────────────────────────────────────────────
292
- commit-gate)
293
- [ "$TOOL_NAME" = "Bash" ] || exit 0
294
- COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
295
- echo "$COMMAND" | grep -qE 'git\s+commit' || exit 0
296
- [ "$CURRENT_PHASE" = "build" ] || exit 0
297
-
298
- if [ ! -f ".odd/.odd-flow-state-ready" ]; then
299
- echo "" >&2
300
- echo "ODD STUDIO [commit-gate]: Commit blocked — odd-flow state not stored." >&2
301
- echo "Call mcp__odd-flow__memory_store key=odd-project-state first." >&2
302
- echo "" >&2
303
- exit 2
304
- fi
305
-
306
- # Marker consumed — next commit requires a fresh store
307
- rm -f ".odd/.odd-flow-state-ready"
308
- exit 0
309
- ;;
310
273
 
311
274
  # ─────────────────────────────────────────────────────────────────────────────
312
275
  # UserPromptSubmit — warns every turn if build phase without swarm
@@ -318,24 +281,7 @@ swarm-guard)
318
281
  DEBUG_SESSION=$(get_state_field "debugSession")
319
282
  [ "$DEBUG_SESSION" = "true" ] && exit 0
320
283
 
321
- # Gate 1: Dirty state (commit without odd-flow store)
322
- if [ -f ".odd/.odd-flow-state-dirty" ]; then
323
- echo ""
324
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
325
- echo "ODD STUDIO — STATE NOT SAVED TO ODD-FLOW"
326
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
327
- echo ""
328
- echo " A git commit was made but .odd/state.json was NOT stored to odd-flow."
329
- echo " DO THIS NOW:"
330
- echo " 1. mcp__odd-flow__memory_store key=odd-project-state namespace=odd-project upsert=true value=<.odd/state.json>"
331
- echo " 2. Bash: rm -f .odd/.odd-flow-state-dirty"
332
- echo ""
333
- echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
334
- echo ""
335
- exit 0
336
- fi
337
-
338
- # Gate 2: Swarm not initialised
284
+ # Swarm not initialised
339
285
  if marker_valid ".odd/.odd-flow-swarm-active" 86400; then
340
286
  exit 0
341
287
  fi
@@ -380,28 +326,14 @@ session-save)
380
326
  } catch(e) {}
381
327
  " 2>/dev/null
382
328
 
383
- # Refresh sync marker + set dirty marker
329
+ # Refresh phase sync marker. Dirty-marker touching removed in v3.7.4.
384
330
  touch .odd/.odd-flow-phase-synced 2>/dev/null
385
- touch .odd/.odd-flow-state-dirty 2>/dev/null
386
331
  exit 0
387
332
  ;;
388
333
 
389
334
  # ─────────────────────────────────────────────────────────────────────────────
390
- # PostToolUse: Bash refresh checkpoint markers after a successful scan
335
+ # checkpoint-validateREMOVED in v3.7.3 (see checkpoint-gate note above)
391
336
  # ─────────────────────────────────────────────────────────────────────────────
392
- checkpoint-validate)
393
- [ "$TOOL_NAME" = "Bash" ] || exit 0
394
- [ "$CURRENT_PHASE" = "build" ] || exit 0
395
- COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
396
- echo "$COMMAND" | grep -qE '@darrenjcoxon/vibeguard|vibeguard' || exit 0
397
-
398
- EXIT_CODE=$(echo "$INPUT" | jq -r '.tool_response.exit_code // .tool_output.exit_code // .exitCode // empty' 2>/dev/null || true)
399
- if [ -z "$EXIT_CODE" ] || [ "$EXIT_CODE" = "0" ]; then
400
- touch .odd/.checkpoint-clear 2>/dev/null
401
- rm -f .odd/.checkpoint-dirty 2>/dev/null
402
- fi
403
- exit 0
404
- ;;
405
337
 
406
338
  # ─────────────────────────────────────────────────────────────────────────────
407
339
  # PostToolUse: Write|Edit state.json — blocks phase transition without Steps 9, 9b, 9d
@@ -445,60 +377,27 @@ plan-complete-gate)
445
377
  ;;
446
378
 
447
379
  # ─────────────────────────────────────────────────────────────────────────────
448
- # PostToolUse: Write|Edit state.jsonmark dirty so swarm-guard nags until stored
380
+ # state-dirty-markREMOVED in v3.7.4 (dirty/ready treadmill eliminated)
449
381
  # ─────────────────────────────────────────────────────────────────────────────
450
- # This catches the gap between commit-triggered dirty marking and actual edits.
451
- # Any edit to state.json (by Claude or by another tool) sets the dirty marker.
452
- # It's cleared only when mcp__odd-flow__memory_store key=odd-project-state succeeds.
453
- state-dirty-mark)
454
- [ "$TOOL_NAME" = "Write" ] || [ "$TOOL_NAME" = "Edit" ] || exit 0
455
- echo "$FILE_PATH" | grep -q '\.odd/state\.json$' || exit 0
456
- touch .odd/.odd-flow-state-dirty 2>/dev/null
457
- exit 0
458
- ;;
459
382
 
460
383
  # ─────────────────────────────────────────────────────────────────────────────
461
- # PostToolUse: mcp__odd-flow__memory_store — creates ready marker
384
+ # PostToolUse: mcp__odd-flow__memory_store — brief-stored marker only
462
385
  # ─────────────────────────────────────────────────────────────────────────────
386
+ # v3.7.4: the state-ready / dirty treadmill has been removed. This hook now
387
+ # only creates the brief-stored marker after a session brief is persisted.
388
+ # odd-project-state stores are logged but do not touch any marker — state
389
+ # persistence is no longer gated by a marker state machine.
463
390
  store-validate)
464
391
  [ "$TOOL_NAME" = "mcp__odd-flow__memory_store" ] || exit 0
465
392
  [ "$CURRENT_PHASE" = "build" ] || exit 0
466
393
 
467
394
  KEY=$(echo "$INPUT" | jq -r '.tool_input.key // empty')
468
395
 
469
- # MCP responses may be nested under tool_response or at root — check both
470
396
  if ! echo "$INPUT" | grep -qE '"success"[[:space:]]*:[[:space:]]*true'; then
471
397
  exit 0
472
398
  fi
473
399
 
474
- # Create the right marker based on what was stored
475
400
  case "$KEY" in
476
- odd-project-state)
477
- # Reject partial snapshots — the value MUST contain the full state.json shape.
478
- # Without this, callers can store {currentBuildPhase: "X"} and silently drift.
479
- VALUE=$(echo "$INPUT" | jq -c '.tool_input.value // empty' 2>/dev/null)
480
- if [ -n "$VALUE" ] && [ "$VALUE" != "null" ] && [ "$VALUE" != "empty" ]; then
481
- MISSING=$(echo "$VALUE" | jq -r '
482
- [
483
- (if has("personas") then empty else "personas" end),
484
- (if has("outcomes") then empty else "outcomes" end),
485
- (if has("currentBuildPhase") then empty else "currentBuildPhase" end),
486
- (if has("currentPhase") then empty else "currentPhase" end)
487
- ] | join(", ")
488
- ' 2>/dev/null)
489
- if [ -n "$MISSING" ]; then
490
- echo "" >&2
491
- echo "ODD STUDIO [store-validate]: Partial odd-project-state rejected." >&2
492
- echo "Missing required keys: $MISSING" >&2
493
- echo "Store the FULL contents of .odd/state.json, not a hand-built object." >&2
494
- echo "" >&2
495
- # Do NOT clear the dirty marker — the next store must include the full file
496
- exit 0
497
- fi
498
- fi
499
- touch .odd/.odd-flow-state-ready 2>/dev/null
500
- rm -f .odd/.odd-flow-state-dirty 2>/dev/null
501
- ;;
502
401
  odd-session-brief-*)
503
402
  touch .odd/.odd-flow-brief-stored 2>/dev/null
504
403
  ;;
@@ -507,12 +406,22 @@ store-validate)
507
406
  ;;
508
407
 
509
408
  # ─────────────────────────────────────────────────────────────────────────────
510
- # PostToolUse: mcp__odd-flow__coordination_sync — creates agents-ready marker
409
+ # PostToolUse: mcp__odd-flow__coordination_sync — completes swarm init
511
410
  # ─────────────────────────────────────────────────────────────────────────────
411
+ # coordination_sync is the LAST step of the 9-step swarm init sequence.
412
+ # When it fires successfully in build phase, the swarm is initialised — so we
413
+ # create all three markers atomically rather than relying on the orchestrator
414
+ # to remember a stray Bash `touch` step buried in a numbered list.
415
+ #
416
+ # Markers created:
417
+ # .odd-flow-swarm-active — gates source writes (24h TTL)
418
+ # .odd-flow-agents-ready — unblocks build-gate for Task agents
419
+ # .odd-flow-phase-synced — confirms agents have phase context
512
420
  sync-validate)
513
421
  [ "$TOOL_NAME" = "mcp__odd-flow__coordination_sync" ] || exit 0
514
422
  [ "$CURRENT_PHASE" = "build" ] || exit 0
515
423
 
424
+ touch .odd/.odd-flow-swarm-active 2>/dev/null
516
425
  touch .odd/.odd-flow-agents-ready 2>/dev/null
517
426
  touch .odd/.odd-flow-phase-synced 2>/dev/null
518
427
  exit 0
@@ -579,7 +488,8 @@ code-quality)
579
488
  ;;
580
489
 
581
490
  # ─────────────────────────────────────────────────────────────────────────────
582
- # PostToolUse: Write|Edit — security baseline warnings + checkpoint dirty marker
491
+ # PostToolUse: Write|Edit — security baseline warnings (stderr, non-blocking)
492
+ # Checkpoint dirty-marking was removed in v3.7.3 along with checkpoint-gate.
583
493
  # ─────────────────────────────────────────────────────────────────────────────
584
494
  security-quality)
585
495
  [ "$TOOL_NAME" = "Write" ] || [ "$TOOL_NAME" = "Edit" ] || exit 0
@@ -588,11 +498,6 @@ security-quality)
588
498
  echo "$FILE_PATH" | grep -qiE '(\.config\.|\.d\.ts|node_modules|\.next|dist/|build/|\.test\.|\.spec\.|__tests__)' && exit 0
589
499
  [ -f "$FILE_PATH" ] || exit 0
590
500
 
591
- if [ "$CURRENT_PHASE" = "build" ]; then
592
- touch .odd/.checkpoint-dirty 2>/dev/null
593
- rm -f .odd/.checkpoint-clear 2>/dev/null
594
- fi
595
-
596
501
  ISSUES=""
597
502
 
598
503
  grep -qEi '\b(api[_-]?key|secret|token|password)\b[^=\n]{0,40}[:=][[:space:]]*["'\''][^"'\'']{8,}["'\'']' "$FILE_PATH" 2>/dev/null \
@@ -1,39 +1,11 @@
1
1
  #!/usr/bin/env bash
2
- # ODD Studio — git post-commit hook
2
+ # ODD Studio — git post-commit hook (no-op)
3
3
  #
4
- # Install to your project with:
5
- # cp .odd/post-commit-hook.sh .git/hooks/post-commit
6
- # chmod +x .git/hooks/post-commit
4
+ # This hook existed in earlier versions to set .odd-flow-state-dirty on every
5
+ # build-phase commit so the swarm-guard would nag until state was stored.
6
+ # In v3.7.4 the dirty/ready marker treadmill was removed because it created
7
+ # more friction than value, so this hook is now a no-op kept only for
8
+ # backwards compatibility with projects that have it installed in .git/hooks.
7
9
  #
8
- # Or run: npx odd-studio install-git-hooks
9
- #
10
- # Why this exists:
11
- # odd-session-save.sh (PostToolUse) covers commits made BY Claude.
12
- # This hook covers commits made by the developer directly in the terminal.
13
- # Together they ensure .odd-flow-state-dirty is always set after a build-phase commit,
14
- # regardless of who made it.
15
- #
16
- # The dirty marker is cleared only after:
17
- # 1. mcp__odd-flow__memory_store key=odd-project-state (saves state to odd-flow)
18
- # 2. rm -f .odd/.odd-flow-state-dirty
19
- #
20
- # odd-swarm-guard.sh (UserPromptSubmit) blocks EVERY Claude turn until cleared.
21
-
22
- STATE_FILE=".odd/state.json"
23
-
24
- if [ ! -f "$STATE_FILE" ]; then
25
- exit 0
26
- fi
27
-
28
- CURRENT_PHASE=$(ODD_STATE_FILE="$STATE_FILE" node -e "
29
- try {
30
- const s = JSON.parse(require('fs').readFileSync(process.env.ODD_STATE_FILE, 'utf8'));
31
- console.log(s.currentPhase || '');
32
- } catch(e) { console.log(''); }
33
- " 2>/dev/null)
34
-
35
- if [ "$CURRENT_PHASE" = "build" ]; then
36
- touch .odd/.odd-flow-state-dirty
37
- fi
38
-
10
+ # Safe to delete from .git/hooks/post-commit if you want.
39
11
  exit 0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "odd-studio",
3
- "version": "3.7.1",
3
+ "version": "3.7.4",
4
4
  "description": "Outcome-Driven Development for AI coding agents — a planning and build harness for domain experts building serious software with AI. Works with Claude Code, OpenCode, and Codex.",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -48,8 +48,6 @@ const GATES = [
48
48
  event: 'PreToolUse',
49
49
  matcher: 'Bash',
50
50
  gates: [
51
- { name: 'checkpoint-gate', timeout: 5, status: 'ODD checkpoint gate...' },
52
- { name: 'commit-gate', timeout: 5, status: 'ODD commit gate...' },
53
51
  ],
54
52
  },
55
53
  // ── UserPromptSubmit ────────────────────────────────────────────────────
@@ -66,7 +64,6 @@ const GATES = [
66
64
  matcher: 'Write',
67
65
  gates: [
68
66
  { name: 'plan-complete-gate', timeout: 5, status: 'ODD plan complete gate...' },
69
- { name: 'state-dirty-mark', timeout: 5, status: 'ODD state dirty mark...' },
70
67
  ],
71
68
  },
72
69
  {
@@ -74,14 +71,12 @@ const GATES = [
74
71
  matcher: 'Edit',
75
72
  gates: [
76
73
  { name: 'plan-complete-gate', timeout: 5, status: 'ODD plan complete gate...' },
77
- { name: 'state-dirty-mark', timeout: 5, status: 'ODD state dirty mark...' },
78
74
  ],
79
75
  },
80
76
  {
81
77
  event: 'PostToolUse',
82
78
  matcher: 'Bash',
83
79
  gates: [
84
- { name: 'checkpoint-validate', timeout: 10, status: 'ODD checkpoint validate...' },
85
80
  { name: 'session-save', timeout: 10, status: 'ODD session save...' },
86
81
  ],
87
82
  },
package/skill/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: "odd"
3
- version: "3.7.1"
3
+ version: "3.7.4"
4
4
  description: "Outcome-Driven Development planning and build coach. Use /odd to start or resume an ODD project — building personas, writing outcomes, mapping contracts, creating a Master Implementation Plan, and directing a odd-flow-powered build. Designed for domain experts who are not developers. Works with Claude Code, OpenCode, and Codex."
5
5
  metadata:
6
6
  priority: 10
@@ -106,7 +106,7 @@ Display this when no existing state is found:
106
106
 
107
107
  ---
108
108
 
109
- Welcome to ODD Studio v3.7.1.
109
+ Welcome to ODD Studio v3.7.4.
110
110
 
111
111
  You are about to plan and build something real — using a methodology called Outcome-Driven Development. Before we write a single line of code, we are going to get precise about three things:
112
112
 
@@ -130,7 +130,7 @@ Display this when existing state is found. Replace the bracketed values with act
130
130
 
131
131
  ---
132
132
 
133
- Welcome back to ODD Studio v3.7.1.
133
+ Welcome back to ODD Studio v3.7.4.
134
134
 
135
135
  **Project:** [project.name]
136
136
  **Current Phase:** [state.currentPhase]
@@ -267,11 +267,11 @@ Execute these steps in order:
267
267
 
268
268
  7. **INITIALISES THE ODD_FLOW SWARM — MANDATORY FIRST ACTION.**
269
269
 
270
- > **This step happens BEFORE loading any files, BEFORE reading source code, BEFORE planning any build work. Swarm init is not a step buried in a checklist — it is the gate that unlocks everything else. If you have not completed the swarm initialisation sequence (all 9 steps in the odd-flow Swarm Initialisation section below), STOP and do it NOW.**
270
+ > **This step happens BEFORE loading any files, BEFORE reading source code, BEFORE planning any build work. Swarm init is not a step buried in a checklist — it is the gate that unlocks everything else. If you have not completed the swarm initialisation sequence (all 8 steps in the odd-flow Swarm Initialisation section below), STOP and do it NOW.**
271
271
  >
272
272
  > The `odd-swarm-guard.sh` hook fires on every user message when in build phase without the swarm marker. If you are reading this and `.odd/.odd-flow-swarm-active` does not exist, the hook is injecting a warning into every response. Do not ignore it. Initialise the swarm now.
273
273
 
274
- See: **odd-flow Swarm Initialisation** section below. Execute all 9 steps, then proceed.
274
+ See: **odd-flow Swarm Initialisation** section below. Execute all 8 steps, then proceed.
275
275
 
276
276
  8. Loads `docs/build/build-protocol.md` and `docs/build/code-excellence.md` into context. The Code Excellence standard is mandatory — the build agent applies the Design-It-Twice protocol to every function, component, and module it writes.
277
277
  9. Confirms to the user which phase is being worked on and which outcomes are in scope.
@@ -398,33 +398,9 @@ The verification walkthrough MUST have been completed in the current session. Th
398
398
 
399
399
  Execute the following steps in order:
400
400
 
401
- **1. Run Checkpoint.**
401
+ **1. Commit the verified state** via git with message: `feat: verified [outcome name] — [phase]`
402
402
 
403
- Execute via Bash: `npx @darrenjcoxon/vibeguard --security-only -o json 2>/dev/null`
404
-
405
- Display to the domain expert: "Checkpoint running..."
406
-
407
- Parse the JSON output. Look for findings with severity `critical`, `high`, or `secret`.
408
-
409
- **If Checkpoint is not installed** (command fails or returns an error): skip silently and display "Checkpoint not installed — type `npx @darrenjcoxon/vibeguard --install-tools` in your terminal to enable security scanning." Then proceed to step 3.
410
-
411
- **2. If Checkpoint finds critical, high, or secret findings:**
412
-
413
- Do NOT advance to the next outcome.
414
-
415
- Translate each finding from technical language to a plain-language fix instruction. Do not show raw scanner output to the domain expert.
416
-
417
- Brief the build agent directly with the fix instructions. Do not ask the domain expert to review them.
418
-
419
- Display: "Checkpoint found [N] security issue(s) in this outcome. The build agent is fixing them now. This does not affect your verification — the outcome behaves correctly. Once the security fix is complete, Checkpoint will run again automatically."
420
-
421
- After the build agent applies fixes, re-run Checkpoint automatically (repeat step 1). Repeat until Checkpoint is clear. Then proceed to step 3.
422
-
423
- **3. If Checkpoint is clear:**
424
-
425
- Display: "Checkpoint clear."
426
-
427
- Commit the verified state via git with message: `feat: verified [outcome name] — [phase]`
403
+ > **Note:** Automated Checkpoint/vibeguard scanning was removed in v3.7.4. The scanner flagged dep-lockfile CVEs as code vulnerabilities and made every commit impossible. Security scanning is reintroduced only with a scanner that can distinguish code findings from lockfile findings. In the meantime, domain experts remain responsible for flagging anything suspicious during the verification walkthrough.
428
404
 
429
405
  Call `mcp__odd-flow__memory_store` key `odd-outcome-[name]` with status `verified`, namespace `odd-project`.
430
406
 
@@ -438,8 +414,6 @@ Display:
438
414
 
439
415
  **[Outcome name] — verified and committed.**
440
416
 
441
- Checkpoint: clear.
442
-
443
417
  **Next:** [next outcome name and one-sentence description]
444
418
 
445
419
  Type `*build` to begin, or `*status` to see the full phase progress.
@@ -707,29 +681,23 @@ Call `mcp__odd-flow__agent_spawn`:
707
681
  - Role: qa
708
682
  - Instructions: `"Read verification steps per outcome from odd-flow. Run all steps after each outcome completes. Report failures in domain language only. Flag as verified or failed."`
709
683
 
710
- ### 8. Activate the Swarm Write Gate
711
-
712
- Create the swarm marker file that unlocks source code writes:
684
+ ### 8. Sync All Agents — automatically activates the write gate
713
685
 
714
- ```bash
715
- touch .odd/.odd-flow-swarm-active
716
- ```
686
+ Call `mcp__odd-flow__coordination_sync`:
687
+ - Namespace: `odd-project`
688
+ - Message: "Phase [n] build started. All agents: retrieve your assignments from odd-flow memory key odd-project-state and begin execution according to the Build Protocol."
717
689
 
718
- **Why this matters:** The `odd-studio.sh` hook enforces a single-marker system during the build phase. The swarm-active marker must exist for source code writes to succeed:
690
+ **This step is the LAST init action.** When `coordination_sync` succeeds in build phase, the `sync-validate` hook automatically creates all three swarm markers:
719
691
 
720
- 1. **`.odd/.odd-flow-swarm-active`** — build session is active (24-hour TTL). Created here at step 8.
692
+ 1. **`.odd/.odd-flow-swarm-active`** — gates source writes (24-hour TTL)
693
+ 2. **`.odd/.odd-flow-agents-ready`** — unblocks build-gate for Task agents
694
+ 3. **`.odd/.odd-flow-phase-synced`** — confirms agents have phase context
721
695
 
722
- Both the main orchestrator AND Task agents can write source code when the swarm-active marker is valid. This removes the friction of the previous two-marker system while still ensuring the build session is properly initialised before any code is written.
696
+ You do NOT manually `touch` these markers. The hook handles it. Steps 1–7 store state and spawn agents in parallel; step 8 finalises and unlocks the build. If the marker is missing after coordination_sync succeeds, the hook is broken fix the hook, do not manually touch the marker.
723
697
 
724
698
  The marker TTL is 24 hours (86400 seconds) because build sessions can last many hours. If the marker expires, run `*build` again to refresh it.
725
699
 
726
- ### 9. Sync All Agents
727
-
728
- Call `mcp__odd-flow__coordination_sync`:
729
- - Namespace: `odd-project`
730
- - Message: "Phase [n] build started. All agents: retrieve your assignments from odd-flow memory key odd-project-state and begin execution according to the Build Protocol."
731
-
732
- ### 10. Confirm to User
700
+ ### 9. Confirm to User
733
701
 
734
702
  Display:
735
703