@kontourai/flow-agents 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/.github/workflows/ci.yml +6 -1
  2. package/.github/workflows/kit-gates-demo.yml +6 -2
  3. package/.github/workflows/runtime-compat.yml +5 -2
  4. package/CHANGELOG.md +51 -0
  5. package/CONTRIBUTING.md +30 -0
  6. package/README.md +26 -5
  7. package/agents/dev.json +1 -1
  8. package/agents/tool-planner.json +1 -1
  9. package/build/src/cli/{flow-kit.js → kit.js} +122 -108
  10. package/build/src/cli/validate-source-tree.js +4 -4
  11. package/build/src/cli/workflow-sidecar.js +70 -5
  12. package/build/src/cli.js +3 -3
  13. package/build/src/flow-kit/validate.js +89 -62
  14. package/build/src/tools/build-universal-bundles.js +78 -17
  15. package/build/src/tools/generate-context-map.js +49 -7
  16. package/build/src/tools/validate-source-tree.js +32 -1
  17. package/console.telemetry.json +1 -1
  18. package/docs/adr/0004-gates-expect-surface-claims.md +7 -7
  19. package/docs/adr/0007-flow-skill-kit-tool-boundary.md +169 -0
  20. package/docs/adr/0007-skill-audit.md +112 -0
  21. package/docs/adr/0008-kit-operation-boundary.md +88 -0
  22. package/docs/context-map.md +18 -22
  23. package/docs/flow-kit-repository-contract.md +5 -5
  24. package/docs/getting-started.md +177 -0
  25. package/docs/index.md +19 -8
  26. package/docs/kit-authoring-guide.md +125 -13
  27. package/docs/knowledge-kit.md +2 -2
  28. package/docs/operating-layers.md +2 -2
  29. package/docs/spec/runtime-hook-surface.md +1 -1
  30. package/docs/veritas-integration.md +4 -4
  31. package/docs/vision.md +1 -1
  32. package/docs/workflow-eval-strategy.md +2 -2
  33. package/docs/workflow-usage-guide.md +2 -2
  34. package/evals/acceptance/test_opencode_harness.sh +18 -10
  35. package/evals/acceptance/test_pi_harness.sh +10 -6
  36. package/evals/ci/run-baseline.sh +1 -1
  37. package/evals/fixtures/builder-kit-workflow-state/happy-path.json +2 -2
  38. package/evals/fixtures/builder-kit-workflow-state/mid-work-resume.json +2 -2
  39. package/evals/fixtures/console-learning-projection/artifacts/console-learning-correction/learning.json +1 -1
  40. package/evals/fixtures/flow-kit-repository/mixed-runtime-kit/flows/runtime.flow.json +4 -4
  41. package/evals/fixtures/flow-kit-repository/valid-local-kit/flows/review.flow.json +4 -4
  42. package/evals/fixtures/kit-conformance-levels/k0-flows-only/flows/review.flow.json +4 -4
  43. package/evals/fixtures/kit-conformance-levels/k1-agent-extension/flows/build.flow.json +4 -4
  44. package/evals/fixtures/kit-conformance-levels/k2-with-evals/flows/synthesize.flow.json +4 -4
  45. package/evals/fixtures/kit-conformance-levels/third-party-extension/flows/review.flow.json +4 -4
  46. package/evals/fixtures/pull-work-provider/github-issues.json +5 -5
  47. package/evals/fixtures/surface-trust/accepted-claim-trust-report.json +2 -2
  48. package/evals/fixtures/surface-trust/artifact-absent.json +2 -2
  49. package/evals/fixtures/surface-trust/integrity-mismatch-trust-report.json +2 -2
  50. package/evals/fixtures/surface-trust/missing-authority-trust-report.json +2 -2
  51. package/evals/fixtures/surface-trust/provider-absent.json +2 -2
  52. package/evals/fixtures/surface-trust/rejected-claim-trust-report.json +2 -2
  53. package/evals/fixtures/surface-trust/stale-claim-trust-snapshot.json +2 -2
  54. package/evals/integration/test_activate_npx_context.sh +2 -2
  55. package/evals/integration/test_bundle_install.sh +17 -12
  56. package/evals/integration/test_console_learning_projection.sh +2 -2
  57. package/evals/integration/test_flow_kit_install_git.sh +7 -7
  58. package/evals/integration/test_flow_kit_repository.sh +4 -4
  59. package/evals/integration/test_goal_fit_hook.sh +144 -0
  60. package/evals/integration/test_kit_conformance_levels.sh +56 -2
  61. package/evals/integration/test_local_flow_kit_install.sh +7 -7
  62. package/evals/integration/test_publish_change_helper.sh +1 -1
  63. package/evals/integration/test_pull_work_provider.sh +1 -1
  64. package/evals/integration/test_runtime_adapter_activation.sh +3 -3
  65. package/evals/integration/test_workflow_sidecar_writer.sh +9 -9
  66. package/evals/lib/node.sh +2 -2
  67. package/evals/static/test_package.sh +3 -3
  68. package/evals/static/test_workflow_skills.sh +19 -19
  69. package/integrations/strands/flow_agents_strands/steering.py +1 -1
  70. package/integrations/strands-ts/src/hooks.ts +1 -1
  71. package/kits/builder/flows/build.flow.json +48 -48
  72. package/kits/builder/flows/shape.flow.json +36 -36
  73. package/kits/builder/kit.json +17 -0
  74. package/{skills → kits/builder/skills}/builder-shape/SKILL.md +4 -4
  75. package/{skills → kits/builder/skills}/idea-to-backlog/SKILL.md +1 -1
  76. package/kits/knowledge/adapters/obsidian-store/index.js +137 -26
  77. package/kits/knowledge/evals/contract-suite/suite.test.js +90 -0
  78. package/kits/knowledge/flows/compile.flow.json +12 -12
  79. package/kits/knowledge/flows/consolidate.flow.json +16 -16
  80. package/kits/knowledge/flows/ingest.flow.json +12 -12
  81. package/kits/knowledge/flows/retire.flow.json +16 -16
  82. package/kits/knowledge/flows/store-contract.flow.json +12 -12
  83. package/kits/knowledge/flows/synthesize.flow.json +16 -16
  84. package/kits/knowledge/kit.json +16 -9
  85. package/kits/release-evidence/flows/release-evidence.flow.json +3 -3
  86. package/package.json +11 -5
  87. package/packaging/packs.json +1 -21
  88. package/schemas/workflow-evidence.schema.json +2 -1
  89. package/scripts/README.md +1 -1
  90. package/scripts/hooks/stop-goal-fit.js +66 -18
  91. package/scripts/kit.js +2 -0
  92. package/skills/README.md +23 -0
  93. package/src/cli/{flow-kit.ts → kit.ts} +124 -109
  94. package/src/cli/validate-source-tree.ts +4 -4
  95. package/src/cli/workflow-sidecar.ts +62 -4
  96. package/src/cli.ts +3 -3
  97. package/src/flow-kit/validate.ts +118 -58
  98. package/src/tools/build-universal-bundles.ts +74 -13
  99. package/src/tools/generate-context-map.ts +36 -6
  100. package/src/tools/validate-source-tree.ts +27 -1
  101. package/scripts/flow-kit.js +0 -2
  102. package/skills/context-budget/SKILL.md +0 -40
  103. package/skills/explore/SKILL.md +0 -137
  104. package/skills/feedback-loop/SKILL.md +0 -87
  105. package/skills/frontend-design/SKILL.md +0 -80
  106. /package/{skills → kits/builder/skills}/deliver/SKILL.md +0 -0
  107. /package/{skills → kits/builder/skills}/design-probe/SKILL.md +0 -0
  108. /package/{skills → kits/builder/skills}/evidence-gate/SKILL.md +0 -0
  109. /package/{skills → kits/builder/skills}/execute-plan/SKILL.md +0 -0
  110. /package/{skills → kits/builder/skills}/fix-bug/SKILL.md +0 -0
  111. /package/{skills → kits/builder/skills}/learning-review/SKILL.md +0 -0
  112. /package/{skills → kits/builder/skills}/pickup-probe/SKILL.md +0 -0
  113. /package/{skills → kits/builder/skills}/plan-work/SKILL.md +0 -0
  114. /package/{skills → kits/builder/skills}/pull-work/SKILL.md +0 -0
  115. /package/{skills → kits/builder/skills}/release-readiness/SKILL.md +0 -0
  116. /package/{skills → kits/builder/skills}/review-work/SKILL.md +0 -0
  117. /package/{skills → kits/builder/skills}/tdd-workflow/SKILL.md +0 -0
  118. /package/{skills → kits/builder/skills}/verify-work/SKILL.md +0 -0
  119. /package/{skills → kits/knowledge/skills}/knowledge-capture/SKILL.md +0 -0
@@ -473,6 +473,150 @@ else
473
473
  _fail "promoted doc is missing source or acceptance sections"
474
474
  fi
475
475
 
476
+ # --- npm-install regression: validator-environment errors must not block goal-fit ---
477
+ # Simulate the npm-installed condition: build/ is present (always shipped in package files)
478
+ # but tsc is absent from PATH, so `npm run workflow:validate-artifacts` (which rebuilds)
479
+ # would fail. The fix directly invokes node build/.../validate-workflow-artifacts.js instead.
480
+
481
+ NPM_INSTALL_REPO="$TMPDIR_EVAL/npm-install-repo"
482
+ mkdir -p "$NPM_INSTALL_REPO/.flow-agents/npm-install-task"
483
+ printf '# Test Repo\n' > "$NPM_INSTALL_REPO/AGENTS.md"
484
+
485
+ cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/npm-install-task--deliver.md" <<'MARKDOWN'
486
+ # npm install test task
487
+
488
+ branch: main
489
+ worktree: main
490
+ created: 2026-06-01
491
+ status: delivered
492
+ type: deliver
493
+
494
+ ## Definition Of Done
495
+ - **User outcome:** Something works.
496
+ - **Acceptance criteria:**
497
+ - [x] Thing works - Evidence: tested
498
+
499
+ ## Goal Fit Gate
500
+ - [x] Original user goal restated
501
+ - [x] Every acceptance criterion has evidence
502
+
503
+ ## Verification Report
504
+
505
+ ### Verdict: PASS
506
+
507
+ ## Final Acceptance
508
+
509
+ - [ ] CI passed
510
+ MARKDOWN
511
+
512
+ cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/state.json" <<'JSON'
513
+ {
514
+ "schema_version": "1.0",
515
+ "task_slug": "npm-install-task",
516
+ "status": "delivered",
517
+ "phase": "done",
518
+ "updated_at": "2026-06-01T00:00:00Z",
519
+ "next_action": { "status": "done", "summary": "Local delivery complete." }
520
+ }
521
+ JSON
522
+
523
+ cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/acceptance.json" <<'JSON'
524
+ {
525
+ "schema_version": "1.0",
526
+ "task_slug": "npm-install-task",
527
+ "criteria": [
528
+ {
529
+ "id": "thing-works",
530
+ "description": "Thing works.",
531
+ "status": "pass",
532
+ "evidence_refs": [
533
+ { "kind": "artifact", "file": "npm-install-task--deliver.md", "summary": "Delivery artifact." }
534
+ ]
535
+ }
536
+ ],
537
+ "goal_fit": { "status": "pass", "summary": "User outcome achieved." }
538
+ }
539
+ JSON
540
+
541
+ cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/evidence.json" <<'JSON'
542
+ {
543
+ "schema_version": "1.0",
544
+ "task_slug": "npm-install-task",
545
+ "verdict": "pass",
546
+ "checks": [
547
+ { "id": "build", "kind": "test", "status": "pass", "summary": "Build passed." }
548
+ ],
549
+ "not_verified_gaps": []
550
+ }
551
+ JSON
552
+
553
+ cat > "$NPM_INSTALL_REPO/.flow-agents/npm-install-task/handoff.json" <<'JSON'
554
+ {
555
+ "schema_version": "1.0",
556
+ "task_slug": "npm-install-task",
557
+ "summary": "Local delivery complete.",
558
+ "current_state_ref": "state.json",
559
+ "next_steps": [],
560
+ "blockers": [],
561
+ "warnings": []
562
+ }
563
+ JSON
564
+
565
+ # Part 1 of fix: invoke the already-built validator directly (no tsc).
566
+ # Poison tsc so that any call to it fails; confirm the hook does not call it
567
+ # and validates clean sidecars successfully.
568
+ FAKE_TSC_DIR="$TMPDIR_EVAL/fake-tsc"
569
+ mkdir -p "$FAKE_TSC_DIR"
570
+ printf '#!/usr/bin/env bash\necho "error TS5023: tsc should not be called" >&2\nexit 1\n' > "$FAKE_TSC_DIR/tsc"
571
+ chmod +x "$FAKE_TSC_DIR/tsc"
572
+
573
+ if PATH="$FAKE_TSC_DIR:$PATH" FLOW_AGENTS_GOAL_FIT_STRICT=true FLOW_AGENTS_REQUIRE_SIDECARS=true \
574
+ node "$ROOT/scripts/hooks/stop-goal-fit.js" \
575
+ >"$TMPDIR_EVAL/npm-install-valid.out" 2>"$TMPDIR_EVAL/npm-install-valid.err" <<JSON
576
+ {"hook_event_name":"Stop","cwd":"$NPM_INSTALL_REPO"}
577
+ JSON
578
+ then
579
+ _pass "strict hook with poisoned tsc uses built validator and does not block valid sidecars"
580
+ else
581
+ _fail "strict hook should not block valid sidecars even with tsc absent: $(cat "$TMPDIR_EVAL/npm-install-valid.err")"
582
+ fi
583
+
584
+ if ! rg -q 'tsc: command not found\|TS5023\|tsc should not be called' "$TMPDIR_EVAL/npm-install-valid.err"; then
585
+ _pass "hook does not emit tsc error noise when using built validator"
586
+ else
587
+ _fail "hook leaked tsc error into goal-fit output"
588
+ fi
589
+
590
+ # Part 2 of fix: when the validator cannot run at all (build/ absent and npm fails),
591
+ # the hook must skip cleanly — never block in strict mode due to an env error.
592
+ mv "$ROOT/build" "$ROOT/build-absent"
593
+
594
+ SPAWN_FAIL_DIR="$TMPDIR_EVAL/spawn-fail"
595
+ mkdir -p "$SPAWN_FAIL_DIR"
596
+ printf '#!/usr/bin/env bash\necho "npm ERR! tsc: command not found" >&2\nexit 127\n' > "$SPAWN_FAIL_DIR/npm"
597
+ chmod +x "$SPAWN_FAIL_DIR/npm"
598
+
599
+ if PATH="$SPAWN_FAIL_DIR:$PATH" FLOW_AGENTS_GOAL_FIT_STRICT=true FLOW_AGENTS_REQUIRE_SIDECARS=true \
600
+ node "$ROOT/scripts/hooks/stop-goal-fit.js" \
601
+ >"$TMPDIR_EVAL/npm-install-env-err.out" 2>"$TMPDIR_EVAL/npm-install-env-err.err" <<JSON
602
+ {"hook_event_name":"Stop","cwd":"$NPM_INSTALL_REPO"}
603
+ JSON
604
+ then
605
+ _pass "strict hook does not block when validator environment fails (build/ absent, tsc missing)"
606
+ else
607
+ _fail "strict hook must not block when validator env fails: $(cat "$TMPDIR_EVAL/npm-install-env-err.err")"
608
+ fi
609
+
610
+ if rg -q 'sidecar validation skipped' "$TMPDIR_EVAL/npm-install-env-err.err"; then
611
+ _pass "hook emits sidecar validation skipped warning for environment errors"
612
+ else
613
+ _fail "hook did not emit 'sidecar validation skipped' for environment errors"
614
+ fi
615
+
616
+ # Restore build/ so subsequent evals are unaffected.
617
+ mv "$ROOT/build-absent" "$ROOT/build"
618
+
619
+
476
620
  if [[ "$errors" -eq 0 ]]; then
477
621
  echo "Goal Fit hook integration passed."
478
622
  exit 0
@@ -23,7 +23,7 @@ run_inspect() {
23
23
  local output="$2"
24
24
  # Route through the main CLI to avoid import.meta.url path-resolution issues.
25
25
  flow_agents_build_ts 2>/dev/null
26
- node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli.js" flow-kit inspect "$kit_dir" >"$output" 2>&1
26
+ node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli.js" kit inspect "$kit_dir" >"$output" 2>&1
27
27
  }
28
28
 
29
29
  # ===================================================================
@@ -164,7 +164,7 @@ run_inspect "$ROOT/kits/builder" "$out" || true
164
164
  if node -e "
165
165
  const d = require('fs').readFileSync('$out', 'utf8');
166
166
  const r = JSON.parse(d);
167
- const required = ['kit_id','kit_name','conformance','targets','third_party_extensions'];
167
+ const required = ['kit_id','kit_name','conformance','targets','third_party_extensions','trust'];
168
168
  for (const k of required) {
169
169
  if (!(k in r)) throw new Error('missing key: ' + k);
170
170
  }
@@ -199,6 +199,60 @@ else
199
199
  cat "$out"
200
200
  fi
201
201
 
202
+ # ===================================================================
203
+ echo ""
204
+ echo "=== 8. Trust axis: first-party allowlist (builder and knowledge) ==="
205
+ # ===================================================================
206
+
207
+ for kit_name in builder knowledge; do
208
+ out="$TMP_DIR/trust-${kit_name}.out"
209
+ run_inspect "$ROOT/kits/$kit_name" "$out" || true
210
+ trust=$(node -e "const d=require('fs').readFileSync('$out','utf8'); console.log(JSON.parse(d).trust)" 2>/dev/null)
211
+ if [[ "$trust" == "first-party" ]]; then
212
+ pass "$kit_name kit trust: first-party (in Kontour allowlist)"
213
+ else
214
+ fail "$kit_name kit trust: expected first-party, got '$trust'"
215
+ cat "$out"
216
+ fi
217
+ done
218
+
219
+ # ===================================================================
220
+ echo ""
221
+ echo "=== 9. Trust axis: unverified for third-party and fixture kits ==="
222
+ # ===================================================================
223
+
224
+ for fixture in k0-flows-only k1-agent-extension k2-with-evals third-party-extension; do
225
+ out="$TMP_DIR/trust-${fixture}.out"
226
+ run_inspect "$ROOT/evals/fixtures/kit-conformance-levels/$fixture" "$out" || true
227
+ trust=$(node -e "const d=require('fs').readFileSync('$out','utf8'); console.log(JSON.parse(d).trust)" 2>/dev/null)
228
+ if [[ "$trust" == "unverified" ]]; then
229
+ pass "$fixture fixture trust: unverified (not in first-party allowlist)"
230
+ else
231
+ fail "$fixture fixture trust: expected unverified, got '$trust'"
232
+ cat "$out"
233
+ fi
234
+ done
235
+
236
+ # ===================================================================
237
+ echo ""
238
+ echo "=== 10. Trust field present in inspect JSON schema ==="
239
+ # ===================================================================
240
+
241
+ out="$TMP_DIR/trust-schema.out"
242
+ run_inspect "$ROOT/kits/builder" "$out" || true
243
+ if node -e "
244
+ const d = require('fs').readFileSync('$out', 'utf8');
245
+ const r = JSON.parse(d);
246
+ if (!('trust' in r)) throw new Error('missing key: trust');
247
+ const valid = ['first-party', 'verified', 'unverified'];
248
+ if (!valid.includes(r.trust)) throw new Error('trust must be one of: ' + valid.join(', ') + '; got: ' + r.trust);
249
+ " 2>/dev/null; then
250
+ pass "inspect JSON output includes trust field with valid value"
251
+ else
252
+ fail "inspect JSON output is missing trust field or has invalid value"
253
+ cat "$out"
254
+ fi
255
+
202
256
  # ===================================================================
203
257
  echo ""
204
258
  if [[ "$errors" -eq 0 ]]; then
@@ -12,7 +12,7 @@ trap 'rm -rf "$TMP_DIR"' EXIT
12
12
  pass() { echo " ✓ $1"; }
13
13
  fail() { echo " ✗ $1"; errors=$((errors + 1)); }
14
14
 
15
- CLI="$ROOT/scripts/flow-kit.js"
15
+ CLI="$ROOT/scripts/kit.js"
16
16
  VALID_SRC="$ROOT/evals/fixtures/flow-kit-repository/valid-local-kit"
17
17
  INVALID_SRC="$ROOT/evals/fixtures/flow-kit-repository/invalid-missing-flow"
18
18
  DEST="$TMP_DIR/install-dest"
@@ -23,7 +23,7 @@ mkdir -p "$DEST"
23
23
  echo "=== Local Flow Kit Install Checks ==="
24
24
 
25
25
  install_output="$TMP_DIR/install.out"
26
- if flow_agents_node "$CLI" install-local "$VALID_SRC" --dest "$DEST" >"$install_output" 2>&1; then
26
+ if flow_agents_node "$CLI" install "$VALID_SRC" --dest "$DEST" >"$install_output" 2>&1; then
27
27
  pass "valid local kit installs into temp destination"
28
28
  else
29
29
  fail "valid local kit install failed"
@@ -52,7 +52,7 @@ fi
52
52
 
53
53
  registry_hash_before_invalid="$(shasum -a 256 "$REGISTRY" | awk '{print $1}')"
54
54
  invalid_output="$TMP_DIR/invalid.out"
55
- if flow_agents_node "$CLI" install-local "$INVALID_SRC" --dest "$DEST" >"$invalid_output" 2>&1; then
55
+ if flow_agents_node "$CLI" install "$INVALID_SRC" --dest "$DEST" >"$invalid_output" 2>&1; then
56
56
  fail "invalid local kit install should fail"
57
57
  sed -n '1,160p' "$invalid_output"
58
58
  elif rg -q 'Flow Kit repository validation failed' "$invalid_output" \
@@ -65,7 +65,7 @@ fi
65
65
 
66
66
  registry_hash_before_idempotent="$(shasum -a 256 "$REGISTRY" | awk '{print $1}')"
67
67
  idempotent_output="$TMP_DIR/idempotent.out"
68
- if flow_agents_node "$CLI" install-local "$VALID_SRC" --dest "$DEST" >"$idempotent_output" 2>&1 \
68
+ if flow_agents_node "$CLI" install "$VALID_SRC" --dest "$DEST" >"$idempotent_output" 2>&1 \
69
69
  && rg -q "already installed" "$idempotent_output" \
70
70
  && [[ "$registry_hash_before_idempotent" == "$(shasum -a 256 "$REGISTRY" | awk '{print $1}')" ]]; then
71
71
  pass "same-source reinstall is idempotent"
@@ -79,7 +79,7 @@ cp -R "$VALID_SRC" "$CONFLICT_SRC"
79
79
  printf '\nconflict copy\n' >> "$CONFLICT_SRC/docs/README.md"
80
80
  conflict_output="$TMP_DIR/conflict.out"
81
81
  registry_hash_before_conflict="$(shasum -a 256 "$REGISTRY" | awk '{print $1}')"
82
- if flow_agents_node "$CLI" install-local "$CONFLICT_SRC" --dest "$DEST" >"$conflict_output" 2>&1; then
82
+ if flow_agents_node "$CLI" install "$CONFLICT_SRC" --dest "$DEST" >"$conflict_output" 2>&1; then
83
83
  fail "different source with existing kit id should conflict"
84
84
  sed -n '1,160p' "$conflict_output"
85
85
  elif rg -q 'conflict: kit' "$conflict_output" \
@@ -91,7 +91,7 @@ else
91
91
  fi
92
92
 
93
93
  force_conflict_output="$TMP_DIR/force-conflict.out"
94
- if flow_agents_node "$CLI" install-local "$CONFLICT_SRC" --dest "$DEST" --force >"$force_conflict_output" 2>&1; then
94
+ if flow_agents_node "$CLI" install "$CONFLICT_SRC" --dest "$DEST" --force >"$force_conflict_output" 2>&1; then
95
95
  fail "--force should not replace a different-source duplicate id"
96
96
  sed -n '1,160p' "$force_conflict_output"
97
97
  elif rg -q 'conflict: kit' "$force_conflict_output" \
@@ -103,7 +103,7 @@ else
103
103
  fi
104
104
 
105
105
  update_output="$TMP_DIR/update.out"
106
- if flow_agents_node "$CLI" install-local "$CONFLICT_SRC" --dest "$DEST" --update >"$update_output" 2>&1 \
106
+ if flow_agents_node "$CLI" install "$CONFLICT_SRC" --dest "$DEST" --update >"$update_output" 2>&1 \
107
107
  && rg -q "updated local kit" "$update_output" \
108
108
  && rg -q "$CONFLICT_SRC" "$REGISTRY"; then
109
109
  pass "explicit update replaces duplicate id source"
@@ -112,7 +112,7 @@ status=$?
112
112
 
113
113
  for risk in runtime schema package hook security; do
114
114
  case "$risk" in
115
- runtime) path="scripts/flow-kit.js" ;;
115
+ runtime) path="scripts/kit.js" ;;
116
116
  schema) path="schemas/workflow-evidence.schema.json" ;;
117
117
  package) path="package.json" ;;
118
118
  hook) path="scripts/hooks/quality-gate.js" ;;
@@ -52,7 +52,7 @@ status=$?
52
52
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planned_base_sha")" == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ]] && pass "marker normalizes planned_base_sha" || fail "marker normalizes planned_base_sha"
53
53
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planned_at")" == "2026-06-03T03:23:14Z" ]] && pass "marker normalizes planned_at" || fail "marker normalizes planned_at"
54
54
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planning_artifact_ref")" == ".flow-agents/idea-to-backlog-source-revision-structured-blockers/idea-to-backlog-source-revision-structured-blockers--plan.md" ]] && pass "marker normalizes planning_artifact_ref" || fail "marker normalizes planning_artifact_ref"
55
- [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planning_scope_refs.0")" == "skills/idea-to-backlog/SKILL.md" ]] && pass "marker normalizes planning_scope_refs" || fail "marker normalizes planning_scope_refs"
55
+ [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.planning_scope_refs.0")" == "kits/builder/skills/idea-to-backlog/SKILL.md" ]] && pass "marker normalizes planning_scope_refs" || fail "marker normalizes planning_scope_refs"
56
56
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.source_revisions.1.repo")" == "kontourai/flow" ]] && pass "marker preserves repo-scoped source_revisions" || fail "marker preserves repo-scoped source_revisions"
57
57
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.blockers.0.ref.owner")" == "kontourai" ]] && pass "structured blocker preserves provider owner" || fail "structured blocker preserves provider owner"
58
58
  [[ "$(json_query "$TMPDIR_EVAL/normalized.json" "items.5.blockers.0.ref.repo")" == "flow" ]] && pass "structured blocker preserves provider repo" || fail "structured blocker preserves provider repo"
@@ -12,7 +12,7 @@ trap 'rm -rf "$TMP_DIR"' EXIT
12
12
  pass() { echo " ✓ $1"; }
13
13
  fail() { echo " ✗ $1"; errors=$((errors + 1)); }
14
14
 
15
- CLI="$ROOT/scripts/flow-kit.js"
15
+ CLI="$ROOT/scripts/kit.js"
16
16
  DEST="$TMP_DIR/runtime-dest"
17
17
  MIXED_SRC="$ROOT/evals/fixtures/flow-kit-repository/mixed-runtime-kit"
18
18
  OUT="$TMP_DIR/activation.json"
@@ -22,7 +22,7 @@ mkdir -p "$DEST"
22
22
 
23
23
  echo "=== Runtime Adapter Activation Checks ==="
24
24
 
25
- if flow_agents_node "$CLI" install-local "$MIXED_SRC" --dest "$DEST" >"$TMP_DIR/install.out" 2>&1; then
25
+ if flow_agents_node "$CLI" install "$MIXED_SRC" --dest "$DEST" >"$TMP_DIR/install.out" 2>&1; then
26
26
  pass "mixed local kit installs into temp destination"
27
27
  else
28
28
  fail "mixed local kit install failed"
@@ -146,7 +146,7 @@ STRANDS_OUT="$TMP_DIR/strands-activation.json"
146
146
  mkdir -p "$STRANDS_DEST"
147
147
 
148
148
  # Install the mixed kit into strands dest so we can assert skills land there too
149
- if flow_agents_node "$CLI" install-local "$MIXED_SRC" --dest "$STRANDS_DEST" >"$TMP_DIR/strands-install.out" 2>&1; then
149
+ if flow_agents_node "$CLI" install "$MIXED_SRC" --dest "$STRANDS_DEST" >"$TMP_DIR/strands-install.out" 2>&1; then
150
150
  pass "mixed local kit installs into strands temp destination"
151
151
  else
152
152
  fail "mixed local kit install failed (strands dest)"
@@ -544,22 +544,22 @@ else
544
544
  _fail "existing invalid acceptance ref rejection was not fail-closed: $(cat "$TMPDIR_EVAL/invalid-acceptance-ref.out" "$TMPDIR_EVAL/invalid-acceptance-ref.err")"
545
545
  fi
546
546
 
547
- SURFACE_CHECK='{"id":"surface-trust-fixture","kind":"policy","status":"pass","summary":"Surface trust evidence passed.","surface_trust_refs":[{"artifact_kind":"TrustReport","artifact_ref":"trust/report.json","gate_id":"builder.surface.claim","claim_type":"surface.claim","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Issued during this workflow."},"authority":{"producer":"surface-local","summary":"Local Surface trust producer."},"integrity":{"status":"matched","summary":"Artifact digest matched expected subject and gate.","digest":"sha256:abc123"},"status":"pass","summary":"Accepted Surface claim."}]}'
547
+ SURFACE_CHECK='{"id":"surface-trust-fixture","kind":"policy","status":"pass","summary":"Hachure trust.bundle evidence passed.","surface_trust_refs":[{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Issued during this workflow."},"authority":{"producer":"surface-local","summary":"Local Surface trust producer."},"integrity":{"status":"matched","summary":"Artifact digest matched expected subject and gate.","digest":"sha256:abc123"},"status":"pass","summary":"Accepted trust.bundle claim."}]}'
548
548
  if flow_agents_node "$WRITER" record-evidence "$ARTIFACT_DIR" \
549
549
  --verdict pass \
550
550
  --check-json "$SURFACE_CHECK" \
551
551
  --timestamp "2026-05-09T00:01:05Z" >"$TMPDIR_EVAL/surface-evidence.out" 2>"$TMPDIR_EVAL/surface-evidence.err" \
552
552
  && rg -q '"surface_trust_refs"' "$ARTIFACT_DIR/evidence.json" \
553
- && rg -q '"artifact_kind": "TrustReport"' "$ARTIFACT_DIR/evidence.json" \
553
+ && rg -q '"artifact_kind": "trust.bundle"' "$ARTIFACT_DIR/evidence.json" \
554
554
  && ! rg -q 'veritas' "$ARTIFACT_DIR/evidence.json"; then
555
- _pass "sidecar writer records provider-neutral Surface trust refs"
555
+ _pass "sidecar writer records Hachure-aligned trust.bundle refs"
556
556
  else
557
- _fail "sidecar writer did not record Surface trust refs: $(cat "$TMPDIR_EVAL/surface-evidence.out" "$TMPDIR_EVAL/surface-evidence.err")"
557
+ _fail "sidecar writer did not record Hachure-aligned trust.bundle refs: $(cat "$TMPDIR_EVAL/surface-evidence.out" "$TMPDIR_EVAL/surface-evidence.err")"
558
558
  fi
559
559
 
560
560
  if flow_agents_node "$WRITER" record-evidence "$ARTIFACT_DIR" \
561
561
  --verdict pass \
562
- --check-json '{"id":"surface-trust-native-field","kind":"policy","status":"pass","summary":"Should fail.","surface_trust_refs":[{"artifact_kind":"Trust Snapshot","artifact_ref":"trust/snapshot.json","gate_id":"builder.surface.claim","claim_type":"surface.claim","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"surface-local","summary":"Producer exists.","veritas_policy":"native-field"},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}]}' >"$TMPDIR_EVAL/surface-invalid.out" 2>&1; then
562
+ --check-json '{"id":"surface-trust-native-field","kind":"policy","status":"pass","summary":"Should fail.","surface_trust_refs":[{"artifact_kind":"trust.bundle","artifact_ref":"trust/snapshot.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"surface-local","summary":"Producer exists.","veritas_policy":"native-field"},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}]}' >"$TMPDIR_EVAL/surface-invalid.out" 2>&1; then
563
563
  _fail "sidecar writer should reject provider-specific Surface trust fields"
564
564
  elif rg -q 'unsupported field' "$TMPDIR_EVAL/surface-invalid.out"; then
565
565
  _pass "sidecar writer rejects provider-specific Surface trust fields"
@@ -581,10 +581,10 @@ check_contradictory_surface_ref() {
581
581
  fi
582
582
  }
583
583
 
584
- check_contradictory_surface_ref "rejected-pass" '{"artifact_kind":"TrustReport","artifact_ref":"trust/report.json","gate_id":"builder.surface.claim","claim_type":"surface.claim","claim_status":"rejected","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"surface-local","summary":"Producer exists."},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}'
585
- check_contradictory_surface_ref "stale-pass" '{"artifact_kind":"TrustReport","artifact_ref":"trust/report.json","gate_id":"builder.surface.claim","claim_type":"surface.claim","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"stale","summary":"Stale."},"authority":{"producer":"surface-local","summary":"Producer exists."},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}'
586
- check_contradictory_surface_ref "missing-authority-pass" '{"artifact_kind":"TrustReport","artifact_ref":"trust/report.json","gate_id":"builder.surface.claim","claim_type":"surface.claim","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"unknown","summary":"Producer missing."},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}'
587
- check_contradictory_surface_ref "integrity-mismatch-pass" '{"artifact_kind":"TrustReport","artifact_ref":"trust/report.json","gate_id":"builder.surface.claim","claim_type":"surface.claim","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"surface-local","summary":"Producer exists."},"integrity":{"status":"mismatch","summary":"Mismatch."},"status":"pass"}'
584
+ check_contradictory_surface_ref "rejected-pass" '{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"rejected","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"surface-local","summary":"Producer exists."},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}'
585
+ check_contradictory_surface_ref "stale-pass" '{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"stale","summary":"Stale."},"authority":{"producer":"surface-local","summary":"Producer exists."},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}'
586
+ check_contradictory_surface_ref "missing-authority-pass" '{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"unknown","summary":"Producer missing."},"integrity":{"status":"matched","summary":"Matched."},"status":"pass"}'
587
+ check_contradictory_surface_ref "integrity-mismatch-pass" '{"artifact_kind":"trust.bundle","artifact_ref":"trust/report.json","gate_id":"builder.trust.bundle","claim_type":"builder.trust.bundle","claim_status":"accepted","subject":"builder-kit","freshness":{"status":"fresh","summary":"Fresh."},"authority":{"producer":"surface-local","summary":"Producer exists."},"integrity":{"status":"mismatch","summary":"Mismatch."},"status":"pass"}'
588
588
 
589
589
  SURFACE_FIXTURE_DIR="$ROOT/evals/fixtures/surface-trust"
590
590
  check_surface_fixture() {
package/evals/lib/node.sh CHANGED
@@ -45,10 +45,10 @@ flow_agents_node() {
45
45
  node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli/validate-source-tree.js" "$@"
46
46
  return
47
47
  ;;
48
- */scripts/flow-kit.js|scripts/flow-kit.js)
48
+ */scripts/kit.js|scripts/kit.js)
49
49
  shift
50
50
  flow_agents_build_ts || return
51
- node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli/flow-kit.js" "$@"
51
+ node "$FLOW_AGENTS_EVAL_ROOT/build/src/cli/kit.js" "$@"
52
52
  return
53
53
  ;;
54
54
  */scripts/effective-backlog-settings.js|scripts/effective-backlog-settings.js)
@@ -211,8 +211,8 @@ for (const gateId of ["verify-gate", "merge-ready-gate"]) {
211
211
  const expectations = Object.values(flow.gates || {}).flatMap((gate) => gate.expects || []);
212
212
  if (!expectations.length) throw new Error("Builder build flow should declare gate expectations");
213
213
  for (const expectation of expectations) {
214
- if (expectation.kind !== "surface.claim") throw new Error(`${expectation.id || "<unknown>"} should remain a surface.claim expectation`);
215
- if (!expectation.claim?.type || !expectation.claim?.accepted_statuses) throw new Error(`${expectation.id || "<unknown>"} should declare claim type and accepted statuses`);
214
+ if (expectation.kind !== "trust.bundle") throw new Error(`${expectation.id || "<unknown>"} should remain a trust.bundle expectation`);
215
+ if (!expectation.bundle_claim?.claimType || !expectation.bundle_claim?.accepted_statuses) throw new Error(`${expectation.id || "<unknown>"} should declare bundle_claim claimType and accepted statuses`);
216
216
  }
217
217
  const flowText = JSON.stringify(flow).toLowerCase();
218
218
  for (const term of ["veritas", "trust_provider", "trust-provider", "provider_name", "provider_ref", "veritas_policy", "veritas_readiness"]) {
@@ -221,7 +221,7 @@ for (const term of ["veritas", "trust_provider", "trust-provider", "provider_nam
221
221
  console.log("ok");
222
222
  NODE
223
223
  then
224
- _pass "installed Builder Kit build flow keeps provider-neutral surface.claim gates"
224
+ _pass "installed Builder Kit build flow keeps provider-neutral trust.bundle gates"
225
225
  else
226
226
  _fail "installed Builder Kit build flow route-back or provider-neutral gate policy missing or wrong"
227
227
  fi
@@ -52,19 +52,19 @@ require_status() {
52
52
 
53
53
  echo "=== Workflow Skill Contract Checks ==="
54
54
 
55
- IDEA="$ROOT/skills/idea-to-backlog/SKILL.md"
56
- BUILDER_SHAPE="$ROOT/skills/builder-shape/SKILL.md"
57
- PULL="$ROOT/skills/pull-work/SKILL.md"
58
- DESIGN_PROBE="$ROOT/skills/design-probe/SKILL.md"
59
- PICKUP_PROBE="$ROOT/skills/pickup-probe/SKILL.md"
60
- EVIDENCE="$ROOT/skills/evidence-gate/SKILL.md"
61
- RELEASE="$ROOT/skills/release-readiness/SKILL.md"
62
- LEARNING="$ROOT/skills/learning-review/SKILL.md"
63
- DELIVER="$ROOT/skills/deliver/SKILL.md"
64
- PLAN_WORK="$ROOT/skills/plan-work/SKILL.md"
65
- EXECUTE_PLAN="$ROOT/skills/execute-plan/SKILL.md"
66
- REVIEW_WORK="$ROOT/skills/review-work/SKILL.md"
67
- VERIFY_WORK="$ROOT/skills/verify-work/SKILL.md"
55
+ IDEA="$ROOT/kits/builder/skills/idea-to-backlog/SKILL.md"
56
+ BUILDER_SHAPE="$ROOT/kits/builder/skills/builder-shape/SKILL.md"
57
+ PULL="$ROOT/kits/builder/skills/pull-work/SKILL.md"
58
+ DESIGN_PROBE="$ROOT/kits/builder/skills/design-probe/SKILL.md"
59
+ PICKUP_PROBE="$ROOT/kits/builder/skills/pickup-probe/SKILL.md"
60
+ EVIDENCE="$ROOT/kits/builder/skills/evidence-gate/SKILL.md"
61
+ RELEASE="$ROOT/kits/builder/skills/release-readiness/SKILL.md"
62
+ LEARNING="$ROOT/kits/builder/skills/learning-review/SKILL.md"
63
+ DELIVER="$ROOT/kits/builder/skills/deliver/SKILL.md"
64
+ PLAN_WORK="$ROOT/kits/builder/skills/plan-work/SKILL.md"
65
+ EXECUTE_PLAN="$ROOT/kits/builder/skills/execute-plan/SKILL.md"
66
+ REVIEW_WORK="$ROOT/kits/builder/skills/review-work/SKILL.md"
67
+ VERIFY_WORK="$ROOT/kits/builder/skills/verify-work/SKILL.md"
68
68
  MAP="$ROOT/docs/skills-map.md"
69
69
  ROOT_CONTEXT="$ROOT/CONTEXT.md"
70
70
  CONTEXT_MAP="$ROOT/docs/context-map.md"
@@ -146,6 +146,7 @@ while IFS= read -r guidance_surface; do
146
146
  done < <(
147
147
  {
148
148
  find "$ROOT/skills" -type f -name '*.md'
149
+ find "$ROOT/kits" -path "*/skills/*/SKILL.md" -type f
149
150
  find "$ROOT/context/contracts" -maxdepth 1 -type f -name '*.md'
150
151
  find "$ROOT/agents" -maxdepth 1 -type f -name '*.json'
151
152
  printf '%s\n' "$ROOT/packaging/manifest.json"
@@ -553,7 +554,7 @@ echo ""
553
554
  echo "--- builder-shape ---"
554
555
  require_text "$BUILDER_SHAPE" '^name: "builder-shape"$' "frontmatter name"
555
556
  require_text "$BUILDER_SHAPE" 'Builder Kit `shape` flow' "defines Builder Kit shape product surface"
556
- require_text "$BUILDER_SHAPE" 'skills/idea-to-backlog/SKILL.md' "delegates to idea-to-backlog"
557
+ require_text "$BUILDER_SHAPE" 'kits/builder/skills/idea-to-backlog/SKILL.md' "delegates to idea-to-backlog"
557
558
  require_text "$BUILDER_SHAPE" 'kits/builder/flows/shape.flow.json' "links Builder Kit Flow Definition"
558
559
  require_text "$BUILDER_SHAPE" 'raw idea.*current conversation context|current conversation context.*raw idea' "accepts raw idea or conversation context"
559
560
  require_text "$BUILDER_SHAPE" 'Probe/alignment' "uses Probe alignment language"
@@ -1074,17 +1075,17 @@ const flow = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
1074
1075
  const expectations = Object.values(flow.gates || {}).flatMap((gate) => gate.expects || []);
1075
1076
  if (!expectations.length) throw new Error("no Builder Kit gate expectations found");
1076
1077
  for (const expectation of expectations) {
1077
- if (expectation.kind !== "surface.claim") throw new Error(`${expectation.id || "<unknown>"} is not a surface.claim expectation`);
1078
- if (!expectation.claim?.type || !expectation.claim?.accepted_statuses) throw new Error(`${expectation.id || "<unknown>"} is missing claim type or accepted statuses`);
1078
+ if (expectation.kind !== "trust.bundle") throw new Error(`${expectation.id || "<unknown>"} is not a trust.bundle expectation`);
1079
+ if (!expectation.bundle_claim?.claimType || !expectation.bundle_claim?.accepted_statuses) throw new Error(`${expectation.id || "<unknown>"} is missing bundle_claim claimType or accepted statuses`);
1079
1080
  }
1080
1081
  const flowText = JSON.stringify(flow).toLowerCase();
1081
1082
  for (const term of ["veritas", "trust_provider", "trust-provider", "provider_name", "provider_ref", "veritas_policy", "veritas_readiness"]) {
1082
1083
  if (flowText.includes(term)) throw new Error(`provider-specific trust field leaked into Builder Kit build flow: ${term}`);
1083
1084
  }
1084
1085
  NODE
1085
- pass "Builder build flow keeps provider-neutral surface.claim expectations"
1086
+ pass "Builder build flow keeps provider-neutral trust.bundle expectations"
1086
1087
  else
1087
- fail "Builder build flow keeps provider-neutral surface.claim expectations"
1088
+ fail "Builder build flow keeps provider-neutral trust.bundle expectations"
1088
1089
  fi
1089
1090
  require_text "$MAP" 'pull-work' "map includes pull-work"
1090
1091
  require_text "$MAP" 'pickup Probe before planning' "map documents pickup Probe before planning"
@@ -1102,7 +1103,6 @@ require_text "$PACKS_MANIFEST" '"name": "core"' "pack manifest defines core pack
1102
1103
  require_text "$PACKS_MANIFEST" '"default": true' "pack manifest defines default pack"
1103
1104
  require_text "$PACKS_MANIFEST" '"name": "development"' "pack manifest defines development pack"
1104
1105
  require_text "$PACKS_MANIFEST" '"eval-rebuild"' "pack manifest includes eval-rebuild"
1105
- require_text "$PACKS_MANIFEST" '"explore"' "pack manifest includes explore"
1106
1106
  require_text "$ROOT/scripts/build-universal-bundles.js" 'FLOW_AGENTS_PACKS' "bundle installer supports pack filtering"
1107
1107
  require_text "$ROOT/evals/integration/test_bundle_install.sh" 'core-pack install keeps core agents' "bundle install test covers pack filtering"
1108
1108
  require_text "$CONTEXT_MAP" 'Context Loading Rules' "context map includes loading rules"
@@ -211,7 +211,7 @@ class SteeringContext:
211
211
  """
212
212
  Surface activated kit flows from the strands-local runtime path.
213
213
 
214
- Reads .flow-agents/runtime/strands/flows/ (written by `flow-kit activate
214
+ Reads .flow-agents/runtime/strands/flows/ (written by `flow-agents kit activate
215
215
  --adapter strands-local`) and emits a brief hint listing active kit flows
216
216
  by id and description so the agent is aware of available workflow guidance.
217
217
  """
@@ -189,7 +189,7 @@ export class FlowAgentsHooks {
189
189
  *
190
190
  * Includes activated kit flows discovered from the strands-local runtime
191
191
  * path (.flow-agents/runtime/strands/flows/) written by
192
- * `flow-kit activate --adapter strands-local`.
192
+ * `flow-agents kit activate --adapter strands-local`.
193
193
  *
194
194
  * Callers should prepend this to the Agent's system prompt:
195
195
  *