@hunter-harness/workflow-harness 0.2.19 → 0.2.21

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 (166) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/CONTEXT.md +20 -0
  3. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +1 -1
  4. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  5. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  6. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  7. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
  8. package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
  9. package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
  10. package/harness/bundles/general/claude-code/harness-run/checklist.md +6 -0
  11. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
  12. package/harness/bundles/general/claude-code/harness-submit/checklist.md +8 -0
  13. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
  14. package/harness/bundles/general/claude-code/harness-test/SKILL.md +1 -1
  15. package/harness/bundles/general/claude-code/protocols/model-routing-protocol.md +22 -0
  16. package/harness/bundles/general/claude-code/scripts/harness_events.py +159 -1
  17. package/harness/bundles/general/claude-code/scripts/harness_integration.py +34 -0
  18. package/harness/bundles/general/claude-code/scripts/harness_ledger.py +149 -9
  19. package/harness/bundles/general/claude-code/scripts/harness_migration_head.py +220 -0
  20. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  21. package/harness/bundles/general/codebuddy/CONTEXT.md +20 -0
  22. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +1 -1
  23. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  24. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  25. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  26. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
  27. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
  28. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
  29. package/harness/bundles/general/codebuddy/harness-run/checklist.md +6 -0
  30. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  31. package/harness/bundles/general/codebuddy/harness-submit/checklist.md +8 -0
  32. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  33. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
  34. package/harness/bundles/general/codebuddy/protocols/model-routing-protocol.md +22 -0
  35. package/harness/bundles/general/codebuddy/scripts/harness_events.py +159 -1
  36. package/harness/bundles/general/codebuddy/scripts/harness_integration.py +34 -0
  37. package/harness/bundles/general/codebuddy/scripts/harness_ledger.py +149 -9
  38. package/harness/bundles/general/codebuddy/scripts/harness_migration_head.py +220 -0
  39. package/harness/bundles/general/codex/.harness-build.json +1 -1
  40. package/harness/bundles/general/codex/CONTEXT.md +20 -0
  41. package/harness/bundles/general/codex/harness-archive/SKILL.md +1 -1
  42. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  43. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  44. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  45. package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
  46. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  47. package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
  48. package/harness/bundles/general/codex/harness-run/checklist.md +6 -0
  49. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  50. package/harness/bundles/general/codex/harness-submit/checklist.md +8 -0
  51. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  52. package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
  53. package/harness/bundles/general/codex/protocols/model-routing-protocol.md +22 -0
  54. package/harness/bundles/general/codex/scripts/harness_events.py +159 -1
  55. package/harness/bundles/general/codex/scripts/harness_integration.py +34 -0
  56. package/harness/bundles/general/codex/scripts/harness_ledger.py +149 -9
  57. package/harness/bundles/general/codex/scripts/harness_migration_head.py +220 -0
  58. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  59. package/harness/bundles/general/cursor/CONTEXT.md +20 -0
  60. package/harness/bundles/general/cursor/harness-archive/SKILL.md +1 -1
  61. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  62. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  63. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  64. package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
  65. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  66. package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
  67. package/harness/bundles/general/cursor/harness-run/checklist.md +6 -0
  68. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  69. package/harness/bundles/general/cursor/harness-submit/checklist.md +8 -0
  70. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  71. package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
  72. package/harness/bundles/general/cursor/protocols/model-routing-protocol.md +22 -0
  73. package/harness/bundles/general/cursor/scripts/harness_events.py +159 -1
  74. package/harness/bundles/general/cursor/scripts/harness_integration.py +34 -0
  75. package/harness/bundles/general/cursor/scripts/harness_ledger.py +149 -9
  76. package/harness/bundles/general/cursor/scripts/harness_migration_head.py +220 -0
  77. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  78. package/harness/bundles/java/claude-code/CONTEXT.md +20 -0
  79. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  80. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +1 -1
  81. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  82. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  83. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  84. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  85. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
  86. package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
  87. package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
  88. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  89. package/harness/bundles/java/claude-code/harness-submit/checklist.md +8 -0
  90. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  91. package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
  92. package/harness/bundles/java/claude-code/protocols/model-routing-protocol.md +22 -0
  93. package/harness/bundles/java/claude-code/scripts/harness_events.py +159 -1
  94. package/harness/bundles/java/claude-code/scripts/harness_integration.py +34 -0
  95. package/harness/bundles/java/claude-code/scripts/harness_ledger.py +149 -9
  96. package/harness/bundles/java/claude-code/scripts/harness_migration_head.py +220 -0
  97. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  98. package/harness/bundles/java/codebuddy/CONTEXT.md +20 -0
  99. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  100. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +1 -1
  101. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  102. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  103. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  104. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  105. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
  106. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
  107. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
  108. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  109. package/harness/bundles/java/codebuddy/harness-submit/checklist.md +8 -0
  110. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  111. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
  112. package/harness/bundles/java/codebuddy/protocols/model-routing-protocol.md +22 -0
  113. package/harness/bundles/java/codebuddy/scripts/harness_events.py +159 -1
  114. package/harness/bundles/java/codebuddy/scripts/harness_integration.py +34 -0
  115. package/harness/bundles/java/codebuddy/scripts/harness_ledger.py +149 -9
  116. package/harness/bundles/java/codebuddy/scripts/harness_migration_head.py +220 -0
  117. package/harness/bundles/java/codex/.harness-build.json +1 -1
  118. package/harness/bundles/java/codex/CONTEXT.md +20 -0
  119. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  120. package/harness/bundles/java/codex/harness-archive/SKILL.md +1 -1
  121. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  122. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  123. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  124. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  125. package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
  126. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  127. package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
  128. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  129. package/harness/bundles/java/codex/harness-submit/checklist.md +8 -0
  130. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  131. package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
  132. package/harness/bundles/java/codex/protocols/model-routing-protocol.md +22 -0
  133. package/harness/bundles/java/codex/scripts/harness_events.py +159 -1
  134. package/harness/bundles/java/codex/scripts/harness_integration.py +34 -0
  135. package/harness/bundles/java/codex/scripts/harness_ledger.py +149 -9
  136. package/harness/bundles/java/codex/scripts/harness_migration_head.py +220 -0
  137. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  138. package/harness/bundles/java/cursor/CONTEXT.md +20 -0
  139. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  140. package/harness/bundles/java/cursor/harness-archive/SKILL.md +1 -1
  141. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  142. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  143. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  144. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  145. package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
  146. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  147. package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
  148. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  149. package/harness/bundles/java/cursor/harness-submit/checklist.md +8 -0
  150. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  151. package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
  152. package/harness/bundles/java/cursor/protocols/model-routing-protocol.md +22 -0
  153. package/harness/bundles/java/cursor/scripts/harness_events.py +159 -1
  154. package/harness/bundles/java/cursor/scripts/harness_integration.py +34 -0
  155. package/harness/bundles/java/cursor/scripts/harness_ledger.py +149 -9
  156. package/harness/bundles/java/cursor/scripts/harness_migration_head.py +220 -0
  157. package/harness/manifests/general/claude-code.json +25 -17
  158. package/harness/manifests/general/codebuddy.json +25 -17
  159. package/harness/manifests/general/codex.json +25 -17
  160. package/harness/manifests/general/cursor.json +25 -17
  161. package/harness/manifests/java/claude-code.json +26 -18
  162. package/harness/manifests/java/codebuddy.json +26 -18
  163. package/harness/manifests/java/codex.json +26 -18
  164. package/harness/manifests/java/cursor.json +26 -18
  165. package/hunter-workflow-family.json +1 -1
  166. package/package.json +1 -1
@@ -0,0 +1,220 @@
1
+ #!/usr/bin/env python3
2
+ """Migration head single-source consistency check (Wave-2 H-7).
3
+
4
+ Canonical file (default ``.harness/config/migration-head.json``)::
5
+
6
+ {
7
+ "schemaVersion": 1,
8
+ "head": "005_example",
9
+ "sources": [
10
+ {"path": "backend/app/config.py", "pattern": "EXPECTED_ALEMBIC_HEAD\\s*=\\s*[\\\"']([^\\\"']+)[\\\"']"},
11
+ {"path": "integration/manifest.json", "jsonPointer": "/migrationHead"}
12
+ ]
13
+ }
14
+
15
+ Each source must resolve to the same ``head`` value. This harness repo may not
16
+ ship alembic; consumer projects declare the canonical file and run::
17
+
18
+ python harness_migration_head.py check --project . --json
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ import argparse
24
+ import json
25
+ import re
26
+ import sys
27
+ from pathlib import Path
28
+ from typing import Any
29
+
30
+ DEFAULT_REL = ".harness/config/migration-head.json"
31
+
32
+
33
+ def emit_json(payload: dict[str, Any], *, as_json: bool) -> None:
34
+ if as_json:
35
+ sys.stdout.write(json.dumps(payload, ensure_ascii=False, indent=2) + "\n")
36
+ else:
37
+ code = payload.get("code") or ("OK" if payload.get("ok") else "FAIL")
38
+ sys.stdout.write(f"{code}\n")
39
+
40
+
41
+ def emit_error(code: str, message: str, *, as_json: bool, extra: dict[str, Any] | None = None) -> int:
42
+ payload: dict[str, Any] = {"ok": False, "code": code, "message": message}
43
+ if extra:
44
+ payload.update(extra)
45
+ stream = sys.stdout if as_json else sys.stderr
46
+ if as_json:
47
+ stream.write(json.dumps(payload, ensure_ascii=False, indent=2) + "\n")
48
+ else:
49
+ stream.write(f"{code}: {message}\n")
50
+ return 1
51
+
52
+
53
+ def _read_json_pointer(data: Any, pointer: str) -> Any:
54
+ if not pointer.startswith("/"):
55
+ raise ValueError(f"jsonPointer must start with /: {pointer}")
56
+ cur = data
57
+ for part in pointer.lstrip("/").split("/"):
58
+ part = part.replace("~1", "/").replace("~0", "~")
59
+ if isinstance(cur, dict) and part in cur:
60
+ cur = cur[part]
61
+ else:
62
+ raise KeyError(pointer)
63
+ return cur
64
+
65
+
66
+ def _extract_source(project: Path, source: dict[str, Any]) -> str:
67
+ rel = str(source.get("path") or "").strip().replace("\\", "/")
68
+ if not rel or rel.startswith("/") or ".." in rel.split("/"):
69
+ raise ValueError(f"invalid source path: {rel}")
70
+ target = (project / rel).resolve()
71
+ try:
72
+ target.relative_to(project.resolve())
73
+ except ValueError as exc:
74
+ raise ValueError(f"source escapes project: {rel}") from exc
75
+ if not target.is_file():
76
+ raise FileNotFoundError(rel)
77
+ text = target.read_text(encoding="utf-8-sig")
78
+ if "jsonPointer" in source and source["jsonPointer"]:
79
+ data = json.loads(text)
80
+ value = _read_json_pointer(data, str(source["jsonPointer"]))
81
+ if value is None or (isinstance(value, str) and not value.strip()):
82
+ raise ValueError(f"empty value at {source['jsonPointer']} in {rel}")
83
+ return str(value).strip()
84
+ pattern = str(source.get("pattern") or "").strip()
85
+ if not pattern:
86
+ raise ValueError(f"source {rel} requires pattern or jsonPointer")
87
+ match = re.search(pattern, text, flags=re.MULTILINE)
88
+ if not match:
89
+ raise ValueError(f"pattern did not match in {rel}")
90
+ return str(match.group(1) if match.lastindex else match.group(0)).strip()
91
+
92
+
93
+ def check_migration_head(
94
+ project: Path,
95
+ *,
96
+ config_rel: str = DEFAULT_REL,
97
+ ) -> dict[str, Any]:
98
+ project = project.resolve()
99
+ config_path = (project / config_rel).resolve()
100
+ try:
101
+ config_path.relative_to(project)
102
+ except ValueError:
103
+ return {
104
+ "ok": False,
105
+ "code": "MIGRATION_HEAD_CONFIG_ESCAPE",
106
+ "message": f"config path escapes project: {config_rel}",
107
+ }
108
+ if not config_path.is_file():
109
+ return {
110
+ "ok": False,
111
+ "code": "MIGRATION_HEAD_MISSING",
112
+ "message": f"canonical migration-head file missing: {config_rel}",
113
+ "configPath": str(config_path),
114
+ }
115
+ try:
116
+ data = json.loads(config_path.read_text(encoding="utf-8-sig"))
117
+ except (OSError, json.JSONDecodeError) as exc:
118
+ return {
119
+ "ok": False,
120
+ "code": "MIGRATION_HEAD_UNREADABLE",
121
+ "message": str(exc),
122
+ "configPath": str(config_path),
123
+ }
124
+ if not isinstance(data, dict) or data.get("schemaVersion") != 1:
125
+ return {
126
+ "ok": False,
127
+ "code": "MIGRATION_HEAD_SCHEMA_INVALID",
128
+ "message": "migration-head.json must be schemaVersion 1 object",
129
+ "configPath": str(config_path),
130
+ }
131
+ head = str(data.get("head") or "").strip()
132
+ sources = data.get("sources")
133
+ if not head:
134
+ return {
135
+ "ok": False,
136
+ "code": "MIGRATION_HEAD_EMPTY",
137
+ "message": "head must be a non-empty string",
138
+ "configPath": str(config_path),
139
+ }
140
+ if not isinstance(sources, list) or not sources:
141
+ return {
142
+ "ok": False,
143
+ "code": "MIGRATION_HEAD_SOURCES_EMPTY",
144
+ "message": "sources must be a non-empty array",
145
+ "configPath": str(config_path),
146
+ }
147
+
148
+ observed: list[dict[str, Any]] = []
149
+ drifts: list[dict[str, Any]] = []
150
+ for index, source in enumerate(sources):
151
+ if not isinstance(source, dict):
152
+ return {
153
+ "ok": False,
154
+ "code": "MIGRATION_HEAD_SOURCE_INVALID",
155
+ "message": f"sources[{index}] must be an object",
156
+ }
157
+ try:
158
+ value = _extract_source(project, source)
159
+ except (OSError, ValueError, KeyError, json.JSONDecodeError) as exc:
160
+ return {
161
+ "ok": False,
162
+ "code": "MIGRATION_HEAD_SOURCE_UNREADABLE",
163
+ "message": str(exc),
164
+ "index": index,
165
+ "path": source.get("path"),
166
+ }
167
+ item = {"path": source.get("path"), "value": value}
168
+ observed.append(item)
169
+ if value != head:
170
+ drifts.append({**item, "expected": head})
171
+
172
+ if drifts:
173
+ return {
174
+ "ok": False,
175
+ "code": "MIGRATION_HEAD_DRIFT",
176
+ "message": "one or more sources disagree with canonical head",
177
+ "head": head,
178
+ "drifts": drifts,
179
+ "observed": observed,
180
+ "configPath": str(config_path),
181
+ }
182
+ return {
183
+ "ok": True,
184
+ "code": "MIGRATION_HEAD_OK",
185
+ "head": head,
186
+ "observed": observed,
187
+ "configPath": str(config_path),
188
+ "sourceCount": len(observed),
189
+ }
190
+
191
+
192
+ def build_parser() -> argparse.ArgumentParser:
193
+ parser = argparse.ArgumentParser(prog="harness_migration_head.py")
194
+ sub = parser.add_subparsers(dest="command", required=True)
195
+ check = sub.add_parser("check", help="verify sources match canonical head")
196
+ check.add_argument("--project", required=True)
197
+ check.add_argument("--config", default=DEFAULT_REL)
198
+ check.add_argument("--json", action="store_true")
199
+ return parser
200
+
201
+
202
+ def main(argv: list[str] | None = None) -> int:
203
+ args = build_parser().parse_args(argv)
204
+ as_json = bool(getattr(args, "json", False))
205
+ if args.command == "check":
206
+ result = check_migration_head(Path(args.project), config_rel=str(args.config))
207
+ if not result.get("ok"):
208
+ return emit_error(
209
+ str(result.get("code") or "MIGRATION_HEAD_FAIL"),
210
+ str(result.get("message") or "check failed"),
211
+ as_json=as_json,
212
+ extra={k: v for k, v in result.items() if k not in {"ok", "code", "message"}},
213
+ )
214
+ emit_json(result, as_json=as_json)
215
+ return 0
216
+ return emit_error("UNKNOWN_COMMAND", f"unknown command: {args.command}", as_json=as_json)
217
+
218
+
219
+ if __name__ == "__main__":
220
+ raise SystemExit(main())
@@ -7,7 +7,7 @@
7
7
  "files": [
8
8
  {
9
9
  "path": ".harness-build.json",
10
- "sha256": "a7fd6e4e51c881e477be82f244cc3ab7ee32936d272b04bb0adc89b7b40d3e81"
10
+ "sha256": "830e24478800623aa6989bbde0b7fd4cf85f1956647556fae2a75b6274ee938d"
11
11
  },
12
12
  {
13
13
  "path": "agents/harness-evaluator.md",
@@ -23,7 +23,7 @@
23
23
  },
24
24
  {
25
25
  "path": "CONTEXT.md",
26
- "sha256": "2318aba4ff5ae4db0a0bff6380d1e9f4ed697caf9a4b2c1458ad2cdda1acb9e8"
26
+ "sha256": "4838854cc45e8bd47552fb34e41cadca3121eeaa4597196568f35e25534d5a33"
27
27
  },
28
28
  {
29
29
  "path": "contracts/ci-metrics.schema.json",
@@ -47,7 +47,7 @@
47
47
  },
48
48
  {
49
49
  "path": "harness-archive/SKILL.md",
50
- "sha256": "de28ac18baac77b3ab0881ead2a5aa2caae5cfccd5405104ec5f7b47331cc8c0"
50
+ "sha256": "3a140ee15487b686c80ab0a92c3d1d3af196d60c1d625aeeb63daf60929668e1"
51
51
  },
52
52
  {
53
53
  "path": "harness-archive/templates/render-summary.mjs",
@@ -67,7 +67,7 @@
67
67
  },
68
68
  {
69
69
  "path": "harness-codebase-map/SKILL.md",
70
- "sha256": "81fd2ec9fee4da20d650e6dc48ab4ab741f12245c281d853f7a00936c7eb9e0b"
70
+ "sha256": "3f5d3e6edaf5da133f4ec601d15fb4476a250256b62ba6c5e927411eb5eafcc0"
71
71
  },
72
72
  {
73
73
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -131,11 +131,11 @@
131
131
  },
132
132
  {
133
133
  "path": "harness-knowledge-ingest/SKILL.md",
134
- "sha256": "ab3a09a404d69852376aaba528abbe44b831aca48f9763783af71fb0efcacf9b"
134
+ "sha256": "0cdb9ef728b4771ce1d5aa85dcb562143a5c25ae7504cb78ebeef5a5635c50a8"
135
135
  },
136
136
  {
137
137
  "path": "harness-knowledge-query/SKILL.md",
138
- "sha256": "7e9fb5f54f07bf2b2394e14be136fe771835c082e40fe7f61206fc11a22bae4e"
138
+ "sha256": "06c4bbe28d8752a318e8ca0d80ea74adb9c95b0d70002471345ad851be5333d0"
139
139
  },
140
140
  {
141
141
  "path": "harness-plan/checklist.md",
@@ -151,7 +151,7 @@
151
151
  },
152
152
  {
153
153
  "path": "harness-plan/SKILL.md",
154
- "sha256": "34df4f0e7e0fa656800b0546e3a724c86c95c96ebf990f145a93154a88dda70e"
154
+ "sha256": "26a7ae5329dd2aead892e3a7802fe50f67ffa3df4c9c83f3e48e1e25cd3803f4"
155
155
  },
156
156
  {
157
157
  "path": "harness-review/checklist.md",
@@ -167,11 +167,11 @@
167
167
  },
168
168
  {
169
169
  "path": "harness-review/SKILL.md",
170
- "sha256": "ce103208e022e238bdd0b6e501c4faf9194b95ed2d736c52816b004eda4812b0"
170
+ "sha256": "ec6ae1bb0922c552f5390840995c294b8cb045860ba1583cd388c37e85a64757"
171
171
  },
172
172
  {
173
173
  "path": "harness-run/checklist.md",
174
- "sha256": "8f8be29c43b2a37885d0ef729ca4a1cb748869d65de0498b0e38f3e1cc7f317a"
174
+ "sha256": "62063fd4c20a12eb9295fb5bade31e10adb2f5a4fd8600446b2109b959c82961"
175
175
  },
176
176
  {
177
177
  "path": "harness-run/protocols.md",
@@ -183,11 +183,11 @@
183
183
  },
184
184
  {
185
185
  "path": "harness-run/SKILL.md",
186
- "sha256": "ee22d79c40fbf24d2ab7eba24448c7e89274bb2a81c7d6875fcc526cfd03e771"
186
+ "sha256": "dd43063183bed8dc0b31c6595abbaa41e7de1409daf803c222fef094180fe025"
187
187
  },
188
188
  {
189
189
  "path": "harness-submit/checklist.md",
190
- "sha256": "54230792cd9716c663ba3e7f569846910f67d0f0955bf38bafb653062111357c"
190
+ "sha256": "85f157b611b69f1c10ed26c06308ad5e46233b5b31f22ad511df60cbc0c221cb"
191
191
  },
192
192
  {
193
193
  "path": "harness-submit/reference.md",
@@ -195,7 +195,7 @@
195
195
  },
196
196
  {
197
197
  "path": "harness-submit/SKILL.md",
198
- "sha256": "3d32ae7ee46dbad5fac6f1363f67e16c6fd9ec0cbdddff926a8ce37b95349c82"
198
+ "sha256": "95b370f04917ce20822c4f60855a8d6ce3d903cd67d874c28cffd2877fcdb1ea"
199
199
  },
200
200
  {
201
201
  "path": "harness-sync/reference.md",
@@ -203,7 +203,7 @@
203
203
  },
204
204
  {
205
205
  "path": "harness-sync/SKILL.md",
206
- "sha256": "02f0b36925dc6e7da64a5674b15e2395c40c4eb91d17ae169c4d557882156dff"
206
+ "sha256": "04cab37d003d7f87824fc33281bb6404f7acb1d75a3f72565a9142f974e1f4b5"
207
207
  },
208
208
  {
209
209
  "path": "harness-test/checklist.md",
@@ -227,7 +227,7 @@
227
227
  },
228
228
  {
229
229
  "path": "harness-test/SKILL.md",
230
- "sha256": "f4a9e2b2d3724d3df2bc0a98784c8dd0cd56c99cd726ecba9669e3d10639694e"
230
+ "sha256": "c7624934d596e906841f5afab27762887957ba54e30a590afbc8723fc693e4ef"
231
231
  },
232
232
  {
233
233
  "path": "protocols/archive-report-protocol.md",
@@ -241,6 +241,10 @@
241
241
  "path": "protocols/ledger-protocol.md",
242
242
  "sha256": "50f9deffcf71de009c56bd2cdd44fb05c7b18faf19ec56b00ff76e8ce897ecf7"
243
243
  },
244
+ {
245
+ "path": "protocols/model-routing-protocol.md",
246
+ "sha256": "1ce493d7dcc7a0c32b07b2d0118fdca40d72ca2487a63566f3c997293269f06e"
247
+ },
244
248
  {
245
249
  "path": "protocols/powershell-protocol.md",
246
250
  "sha256": "f723f18eee08125e75f387e655f7e604eb603f636cd6809dd6b5948748f32d04"
@@ -287,7 +291,7 @@
287
291
  },
288
292
  {
289
293
  "path": "scripts/harness_events.py",
290
- "sha256": "dcc4c1e4c2967ec7a07c103890f45f2903fc2784adebe3d6c5ae8e92037efd4f"
294
+ "sha256": "94880e69acde59e13afaa338d9ac80a5481e1c84abfbffaf7f5438089655d21a"
291
295
  },
292
296
  {
293
297
  "path": "scripts/harness_gate.py",
@@ -295,11 +299,15 @@
295
299
  },
296
300
  {
297
301
  "path": "scripts/harness_integration.py",
298
- "sha256": "ab963ef60b554118858124a6a8ed3af09bdc0bf78a873251825aee225ad77ad4"
302
+ "sha256": "78904ed2a6254be6671a2627863759c68a9576ef41584f423c5cde3faa6d6b25"
299
303
  },
300
304
  {
301
305
  "path": "scripts/harness_ledger.py",
302
- "sha256": "6d6b5fd9626178d5c10d0fd878f5a31c137b8b292e6a65838f6f06e0991e7576"
306
+ "sha256": "11340d0e84fc3905d2d7383683ac94d2b9ab13655e56a26e460d7e9b0b515f1a"
307
+ },
308
+ {
309
+ "path": "scripts/harness_migration_head.py",
310
+ "sha256": "6bce06ce5c077185d6e40e1655c37ef98b2f8e6e39d64b2f3f3c45f12854ed51"
303
311
  },
304
312
  {
305
313
  "path": "scripts/harness_paths.py",
@@ -7,7 +7,7 @@
7
7
  "files": [
8
8
  {
9
9
  "path": ".harness-build.json",
10
- "sha256": "ba0b0fced31b46fda93feb03a5a13da070ebe1fd908533e72653167652b51387"
10
+ "sha256": "d1d84eae49aaaa68798c3ffc72674cda7c16e963a9ccf78be6661ded54b7a7ab"
11
11
  },
12
12
  {
13
13
  "path": "agents/harness-evaluator.md",
@@ -23,7 +23,7 @@
23
23
  },
24
24
  {
25
25
  "path": "CONTEXT.md",
26
- "sha256": "2318aba4ff5ae4db0a0bff6380d1e9f4ed697caf9a4b2c1458ad2cdda1acb9e8"
26
+ "sha256": "4838854cc45e8bd47552fb34e41cadca3121eeaa4597196568f35e25534d5a33"
27
27
  },
28
28
  {
29
29
  "path": "contracts/ci-metrics.schema.json",
@@ -47,7 +47,7 @@
47
47
  },
48
48
  {
49
49
  "path": "harness-archive/SKILL.md",
50
- "sha256": "1a341e5577d13e452cf0c104589c7715b6daa839fbf69a8e1a85d508452f6364"
50
+ "sha256": "ff53904b81933921702cc2e8a907c6ef2994563f1f58fa99b4ac856694ae54a5"
51
51
  },
52
52
  {
53
53
  "path": "harness-archive/templates/render-summary.mjs",
@@ -67,7 +67,7 @@
67
67
  },
68
68
  {
69
69
  "path": "harness-codebase-map/SKILL.md",
70
- "sha256": "f510002d2e2c049c2b00e46c513adb0f4106bb8b30f9dba8d4a076e513f513c3"
70
+ "sha256": "9bfce0b627a1a26d94a52f1a292a1740388612f210200313cc1319ef6cee66b2"
71
71
  },
72
72
  {
73
73
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -131,11 +131,11 @@
131
131
  },
132
132
  {
133
133
  "path": "harness-knowledge-ingest/SKILL.md",
134
- "sha256": "d7fba15d9471c14b9721796e537102c74e8005c80871b919a6ae55e1786802a1"
134
+ "sha256": "7be15c952b6f43c1878c03b5403a83dddba9fea9a798a5ce026587f83e7fc5f9"
135
135
  },
136
136
  {
137
137
  "path": "harness-knowledge-query/SKILL.md",
138
- "sha256": "b78584a590e87fdc2457b9468e0768730e0dc6a0dc542532274172658ba19c0b"
138
+ "sha256": "265d6f50688fd6201299cda42ddffcaa1c320c3b724df02954fb8ca3fb249c03"
139
139
  },
140
140
  {
141
141
  "path": "harness-plan/checklist.md",
@@ -151,7 +151,7 @@
151
151
  },
152
152
  {
153
153
  "path": "harness-plan/SKILL.md",
154
- "sha256": "5554c4cc48ab2b05bb89a738156f58354d87c2c0cf2397d2fc388912541293e2"
154
+ "sha256": "f0eb0971e5298b5f7e5b925fe4ca8dabcdad57dd0b74b0af94750acea496e584"
155
155
  },
156
156
  {
157
157
  "path": "harness-review/checklist.md",
@@ -167,11 +167,11 @@
167
167
  },
168
168
  {
169
169
  "path": "harness-review/SKILL.md",
170
- "sha256": "eba3f0acc790a926d9cc7067e4fba4049948d2f1ca68c928cdcf4324a271796f"
170
+ "sha256": "69d6e24bedfd051fcaf93166c32caeebf1dbc81ebd7fafb6cc5b955176bb2c06"
171
171
  },
172
172
  {
173
173
  "path": "harness-run/checklist.md",
174
- "sha256": "8f8be29c43b2a37885d0ef729ca4a1cb748869d65de0498b0e38f3e1cc7f317a"
174
+ "sha256": "62063fd4c20a12eb9295fb5bade31e10adb2f5a4fd8600446b2109b959c82961"
175
175
  },
176
176
  {
177
177
  "path": "harness-run/protocols.md",
@@ -183,11 +183,11 @@
183
183
  },
184
184
  {
185
185
  "path": "harness-run/SKILL.md",
186
- "sha256": "1b2ecf9d1563faa27b0b38aa610655165992bf482d4a2d458b6ba52fb756bf04"
186
+ "sha256": "62eda138e8e2477e8730ca5361cad5caca1ac814c60a98c641c7d4a99db9cf78"
187
187
  },
188
188
  {
189
189
  "path": "harness-submit/checklist.md",
190
- "sha256": "54230792cd9716c663ba3e7f569846910f67d0f0955bf38bafb653062111357c"
190
+ "sha256": "85f157b611b69f1c10ed26c06308ad5e46233b5b31f22ad511df60cbc0c221cb"
191
191
  },
192
192
  {
193
193
  "path": "harness-submit/reference.md",
@@ -195,7 +195,7 @@
195
195
  },
196
196
  {
197
197
  "path": "harness-submit/SKILL.md",
198
- "sha256": "017cc1b8d658143e65978806aee18c795b02304c60e01c77a6503ba93869cc07"
198
+ "sha256": "579d59958a9d81b12ca619d6362d15cb64cd1c71ad4781753da572f2afe066b4"
199
199
  },
200
200
  {
201
201
  "path": "harness-sync/reference.md",
@@ -203,7 +203,7 @@
203
203
  },
204
204
  {
205
205
  "path": "harness-sync/SKILL.md",
206
- "sha256": "fab6d711894235a0a43c8bda499dda135454ce13f3cf7511183b756091863180"
206
+ "sha256": "9e8587f272aa456a6b4d1eddf0ae9875e5bae52ff3664d9989312edd68735397"
207
207
  },
208
208
  {
209
209
  "path": "harness-test/checklist.md",
@@ -227,7 +227,7 @@
227
227
  },
228
228
  {
229
229
  "path": "harness-test/SKILL.md",
230
- "sha256": "e9ab2bf7fb5f6501700d48e943cf15f7a1fdb7f9fdb994e8cd90d61b13d0fcd2"
230
+ "sha256": "1c75b9f9dd07f2f4deb49f5c754b7ea1f6d39c2900e42793982d9116f26d6c5c"
231
231
  },
232
232
  {
233
233
  "path": "protocols/archive-report-protocol.md",
@@ -241,6 +241,10 @@
241
241
  "path": "protocols/ledger-protocol.md",
242
242
  "sha256": "50f9deffcf71de009c56bd2cdd44fb05c7b18faf19ec56b00ff76e8ce897ecf7"
243
243
  },
244
+ {
245
+ "path": "protocols/model-routing-protocol.md",
246
+ "sha256": "1ce493d7dcc7a0c32b07b2d0118fdca40d72ca2487a63566f3c997293269f06e"
247
+ },
244
248
  {
245
249
  "path": "protocols/powershell-protocol.md",
246
250
  "sha256": "f723f18eee08125e75f387e655f7e604eb603f636cd6809dd6b5948748f32d04"
@@ -287,7 +291,7 @@
287
291
  },
288
292
  {
289
293
  "path": "scripts/harness_events.py",
290
- "sha256": "dcc4c1e4c2967ec7a07c103890f45f2903fc2784adebe3d6c5ae8e92037efd4f"
294
+ "sha256": "94880e69acde59e13afaa338d9ac80a5481e1c84abfbffaf7f5438089655d21a"
291
295
  },
292
296
  {
293
297
  "path": "scripts/harness_gate.py",
@@ -295,11 +299,15 @@
295
299
  },
296
300
  {
297
301
  "path": "scripts/harness_integration.py",
298
- "sha256": "ab963ef60b554118858124a6a8ed3af09bdc0bf78a873251825aee225ad77ad4"
302
+ "sha256": "78904ed2a6254be6671a2627863759c68a9576ef41584f423c5cde3faa6d6b25"
299
303
  },
300
304
  {
301
305
  "path": "scripts/harness_ledger.py",
302
- "sha256": "6d6b5fd9626178d5c10d0fd878f5a31c137b8b292e6a65838f6f06e0991e7576"
306
+ "sha256": "11340d0e84fc3905d2d7383683ac94d2b9ab13655e56a26e460d7e9b0b515f1a"
307
+ },
308
+ {
309
+ "path": "scripts/harness_migration_head.py",
310
+ "sha256": "6bce06ce5c077185d6e40e1655c37ef98b2f8e6e39d64b2f3f3c45f12854ed51"
303
311
  },
304
312
  {
305
313
  "path": "scripts/harness_paths.py",
@@ -7,11 +7,11 @@
7
7
  "files": [
8
8
  {
9
9
  "path": ".harness-build.json",
10
- "sha256": "52cbf5f48f6ff848c919e06bd2a616c67165868c7b3985f1dc6722ecb5866e04"
10
+ "sha256": "457596a904b9bbedb97f038c4ca94824dd2922214e183d3a24e73c2652a4071e"
11
11
  },
12
12
  {
13
13
  "path": "CONTEXT.md",
14
- "sha256": "2318aba4ff5ae4db0a0bff6380d1e9f4ed697caf9a4b2c1458ad2cdda1acb9e8"
14
+ "sha256": "4838854cc45e8bd47552fb34e41cadca3121eeaa4597196568f35e25534d5a33"
15
15
  },
16
16
  {
17
17
  "path": "contracts/ci-metrics.schema.json",
@@ -35,7 +35,7 @@
35
35
  },
36
36
  {
37
37
  "path": "harness-archive/SKILL.md",
38
- "sha256": "ff182c430076732e9437713a5ff315a743ca7fc25c1944aa6d7206bdf7e36158"
38
+ "sha256": "6ca2b66071b9eddda73530ce38bd9ad9583c04029ed114214ce61c93e77b19b7"
39
39
  },
40
40
  {
41
41
  "path": "harness-archive/templates/render-summary.mjs",
@@ -55,7 +55,7 @@
55
55
  },
56
56
  {
57
57
  "path": "harness-codebase-map/SKILL.md",
58
- "sha256": "0cf5e715893f8f056ee99eb529071be35bd69a454523ac14ef8b1df183499dcf"
58
+ "sha256": "c56f7982d25ea2b2d4fc0c714195a92832f23ab099bd20ce6be4c3dd0627ff52"
59
59
  },
60
60
  {
61
61
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -119,11 +119,11 @@
119
119
  },
120
120
  {
121
121
  "path": "harness-knowledge-ingest/SKILL.md",
122
- "sha256": "e0f9fb3ec08d74985f2eba19b4bc4c6827251f2bb4d7eb9082b2d677489379ee"
122
+ "sha256": "fac5252cd5d47568ffa558e9fe379734f1a04d013545ad8143cb1bbd5fe10639"
123
123
  },
124
124
  {
125
125
  "path": "harness-knowledge-query/SKILL.md",
126
- "sha256": "f3c024d3f41090bea50b44e96524ff57c5fedbb5aeddded11aa07eefbbab3350"
126
+ "sha256": "9da852ed90f1f09ebe9a41a1eda180976e9ba2b450b78f0d13da124406694f2e"
127
127
  },
128
128
  {
129
129
  "path": "harness-plan/checklist.md",
@@ -139,7 +139,7 @@
139
139
  },
140
140
  {
141
141
  "path": "harness-plan/SKILL.md",
142
- "sha256": "19051852756f719ae7ca24af46a2189bc98419d2111b6cfc388fb02d663122a7"
142
+ "sha256": "cf96ef54fc2e1c07f87a7121ecbc6f66d93f7fe045065dfd4adc6499cb9829dc"
143
143
  },
144
144
  {
145
145
  "path": "harness-review/checklist.md",
@@ -155,11 +155,11 @@
155
155
  },
156
156
  {
157
157
  "path": "harness-review/SKILL.md",
158
- "sha256": "8a1bec3db8727f960012f13b0aad234a2b40c63b45047432f701acc27f4e7dcb"
158
+ "sha256": "68ee4960fdebe8204d0fbfb41ab8262656dc5b3c3e77fe60f4812ec5bd171615"
159
159
  },
160
160
  {
161
161
  "path": "harness-run/checklist.md",
162
- "sha256": "8f8be29c43b2a37885d0ef729ca4a1cb748869d65de0498b0e38f3e1cc7f317a"
162
+ "sha256": "62063fd4c20a12eb9295fb5bade31e10adb2f5a4fd8600446b2109b959c82961"
163
163
  },
164
164
  {
165
165
  "path": "harness-run/protocols.md",
@@ -171,11 +171,11 @@
171
171
  },
172
172
  {
173
173
  "path": "harness-run/SKILL.md",
174
- "sha256": "30e61e3385e755f5a560fb19af2224f441b3799b6d5fae695ec0cb7c9b837801"
174
+ "sha256": "eaaeb1da20b0949de6889ca128b1d2272676780c4bef1172590fd6c695209a92"
175
175
  },
176
176
  {
177
177
  "path": "harness-submit/checklist.md",
178
- "sha256": "54230792cd9716c663ba3e7f569846910f67d0f0955bf38bafb653062111357c"
178
+ "sha256": "85f157b611b69f1c10ed26c06308ad5e46233b5b31f22ad511df60cbc0c221cb"
179
179
  },
180
180
  {
181
181
  "path": "harness-submit/reference.md",
@@ -183,7 +183,7 @@
183
183
  },
184
184
  {
185
185
  "path": "harness-submit/SKILL.md",
186
- "sha256": "beacfb608371d20a9f7d73fa1897690e0bea45d664c88c18b403dd38d694048c"
186
+ "sha256": "8be22c0006c3365a98924c1c6e84b203cb917a8a6e915df75387a2831cf20f23"
187
187
  },
188
188
  {
189
189
  "path": "harness-sync/reference.md",
@@ -191,7 +191,7 @@
191
191
  },
192
192
  {
193
193
  "path": "harness-sync/SKILL.md",
194
- "sha256": "0e59973990c04d2568fcf894abf949260df32497dbb1ef86f0638472ac5f248e"
194
+ "sha256": "0fe47a7cffacf5f3cad60341006e17d52d685d8a64ed8508fc974755ac280502"
195
195
  },
196
196
  {
197
197
  "path": "harness-test/checklist.md",
@@ -215,7 +215,7 @@
215
215
  },
216
216
  {
217
217
  "path": "harness-test/SKILL.md",
218
- "sha256": "4467b660c0b8aecc79fe2f5044913b6e612a9acb5bbd6e02030719cdd8e87ef3"
218
+ "sha256": "cbc93e0f520e42ddd2e75e91b079e0bb3c3ecc0477aedf54440ba946fa7de645"
219
219
  },
220
220
  {
221
221
  "path": "protocols/archive-report-protocol.md",
@@ -229,6 +229,10 @@
229
229
  "path": "protocols/ledger-protocol.md",
230
230
  "sha256": "50f9deffcf71de009c56bd2cdd44fb05c7b18faf19ec56b00ff76e8ce897ecf7"
231
231
  },
232
+ {
233
+ "path": "protocols/model-routing-protocol.md",
234
+ "sha256": "1ce493d7dcc7a0c32b07b2d0118fdca40d72ca2487a63566f3c997293269f06e"
235
+ },
232
236
  {
233
237
  "path": "protocols/powershell-protocol.md",
234
238
  "sha256": "f723f18eee08125e75f387e655f7e604eb603f636cd6809dd6b5948748f32d04"
@@ -275,7 +279,7 @@
275
279
  },
276
280
  {
277
281
  "path": "scripts/harness_events.py",
278
- "sha256": "dcc4c1e4c2967ec7a07c103890f45f2903fc2784adebe3d6c5ae8e92037efd4f"
282
+ "sha256": "94880e69acde59e13afaa338d9ac80a5481e1c84abfbffaf7f5438089655d21a"
279
283
  },
280
284
  {
281
285
  "path": "scripts/harness_gate.py",
@@ -283,11 +287,15 @@
283
287
  },
284
288
  {
285
289
  "path": "scripts/harness_integration.py",
286
- "sha256": "ab963ef60b554118858124a6a8ed3af09bdc0bf78a873251825aee225ad77ad4"
290
+ "sha256": "78904ed2a6254be6671a2627863759c68a9576ef41584f423c5cde3faa6d6b25"
287
291
  },
288
292
  {
289
293
  "path": "scripts/harness_ledger.py",
290
- "sha256": "6d6b5fd9626178d5c10d0fd878f5a31c137b8b292e6a65838f6f06e0991e7576"
294
+ "sha256": "11340d0e84fc3905d2d7383683ac94d2b9ab13655e56a26e460d7e9b0b515f1a"
295
+ },
296
+ {
297
+ "path": "scripts/harness_migration_head.py",
298
+ "sha256": "6bce06ce5c077185d6e40e1655c37ef98b2f8e6e39d64b2f3f3c45f12854ed51"
291
299
  },
292
300
  {
293
301
  "path": "scripts/harness_paths.py",