@hunter-harness/workflow-harness 0.2.81 → 0.2.82

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 (130) hide show
  1. package/harness/bundles/general/claude-code/.harness-build.json +1 -1
  2. package/harness/bundles/general/claude-code/harness-archive/SKILL.md +6 -2
  3. package/harness/bundles/general/claude-code/harness-codebase-map/SKILL.md +1 -1
  4. package/harness/bundles/general/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  5. package/harness/bundles/general/claude-code/harness-knowledge-query/SKILL.md +1 -1
  6. package/harness/bundles/general/claude-code/harness-plan/SKILL.md +1 -1
  7. package/harness/bundles/general/claude-code/harness-pull/SKILL.md +1 -1
  8. package/harness/bundles/general/claude-code/harness-push/SKILL.md +6 -2
  9. package/harness/bundles/general/claude-code/harness-review/SKILL.md +1 -1
  10. package/harness/bundles/general/claude-code/harness-run/SKILL.md +1 -1
  11. package/harness/bundles/general/claude-code/harness-submit/SKILL.md +1 -1
  12. package/harness/bundles/general/claude-code/harness-sync/SKILL.md +1 -1
  13. package/harness/bundles/general/claude-code/harness-test/SKILL.md +1 -1
  14. package/harness/bundles/general/claude-code/scripts/harness_archive.py +173 -20
  15. package/harness/bundles/general/codebuddy/.harness-build.json +1 -1
  16. package/harness/bundles/general/codebuddy/harness-archive/SKILL.md +6 -2
  17. package/harness/bundles/general/codebuddy/harness-codebase-map/SKILL.md +1 -1
  18. package/harness/bundles/general/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  19. package/harness/bundles/general/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  20. package/harness/bundles/general/codebuddy/harness-plan/SKILL.md +1 -1
  21. package/harness/bundles/general/codebuddy/harness-pull/SKILL.md +1 -1
  22. package/harness/bundles/general/codebuddy/harness-push/SKILL.md +6 -2
  23. package/harness/bundles/general/codebuddy/harness-review/SKILL.md +1 -1
  24. package/harness/bundles/general/codebuddy/harness-run/SKILL.md +1 -1
  25. package/harness/bundles/general/codebuddy/harness-submit/SKILL.md +1 -1
  26. package/harness/bundles/general/codebuddy/harness-sync/SKILL.md +1 -1
  27. package/harness/bundles/general/codebuddy/harness-test/SKILL.md +1 -1
  28. package/harness/bundles/general/codebuddy/scripts/harness_archive.py +173 -20
  29. package/harness/bundles/general/codex/.harness-build.json +1 -1
  30. package/harness/bundles/general/codex/harness-archive/SKILL.md +6 -2
  31. package/harness/bundles/general/codex/harness-codebase-map/SKILL.md +1 -1
  32. package/harness/bundles/general/codex/harness-knowledge-ingest/SKILL.md +1 -1
  33. package/harness/bundles/general/codex/harness-knowledge-query/SKILL.md +1 -1
  34. package/harness/bundles/general/codex/harness-plan/SKILL.md +1 -1
  35. package/harness/bundles/general/codex/harness-pull/SKILL.md +1 -1
  36. package/harness/bundles/general/codex/harness-push/SKILL.md +6 -2
  37. package/harness/bundles/general/codex/harness-review/SKILL.md +1 -1
  38. package/harness/bundles/general/codex/harness-run/SKILL.md +1 -1
  39. package/harness/bundles/general/codex/harness-submit/SKILL.md +1 -1
  40. package/harness/bundles/general/codex/harness-sync/SKILL.md +1 -1
  41. package/harness/bundles/general/codex/harness-test/SKILL.md +1 -1
  42. package/harness/bundles/general/codex/scripts/harness_archive.py +173 -20
  43. package/harness/bundles/general/cursor/.harness-build.json +1 -1
  44. package/harness/bundles/general/cursor/harness-archive/SKILL.md +6 -2
  45. package/harness/bundles/general/cursor/harness-codebase-map/SKILL.md +1 -1
  46. package/harness/bundles/general/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  47. package/harness/bundles/general/cursor/harness-knowledge-query/SKILL.md +1 -1
  48. package/harness/bundles/general/cursor/harness-plan/SKILL.md +1 -1
  49. package/harness/bundles/general/cursor/harness-pull/SKILL.md +1 -1
  50. package/harness/bundles/general/cursor/harness-push/SKILL.md +6 -2
  51. package/harness/bundles/general/cursor/harness-review/SKILL.md +1 -1
  52. package/harness/bundles/general/cursor/harness-run/SKILL.md +1 -1
  53. package/harness/bundles/general/cursor/harness-submit/SKILL.md +1 -1
  54. package/harness/bundles/general/cursor/harness-sync/SKILL.md +1 -1
  55. package/harness/bundles/general/cursor/harness-test/SKILL.md +1 -1
  56. package/harness/bundles/general/cursor/scripts/harness_archive.py +173 -20
  57. package/harness/bundles/java/claude-code/.harness-build.json +1 -1
  58. package/harness/bundles/java/claude-code/harness-apidoc/SKILL.md +1 -1
  59. package/harness/bundles/java/claude-code/harness-archive/SKILL.md +6 -2
  60. package/harness/bundles/java/claude-code/harness-codebase-map/SKILL.md +1 -1
  61. package/harness/bundles/java/claude-code/harness-knowledge-ingest/SKILL.md +1 -1
  62. package/harness/bundles/java/claude-code/harness-knowledge-query/SKILL.md +1 -1
  63. package/harness/bundles/java/claude-code/harness-package/SKILL.md +1 -1
  64. package/harness/bundles/java/claude-code/harness-plan/SKILL.md +1 -1
  65. package/harness/bundles/java/claude-code/harness-pull/SKILL.md +1 -1
  66. package/harness/bundles/java/claude-code/harness-push/SKILL.md +6 -2
  67. package/harness/bundles/java/claude-code/harness-review/SKILL.md +1 -1
  68. package/harness/bundles/java/claude-code/harness-run/SKILL.md +1 -1
  69. package/harness/bundles/java/claude-code/harness-submit/SKILL.md +1 -1
  70. package/harness/bundles/java/claude-code/harness-sync/SKILL.md +1 -1
  71. package/harness/bundles/java/claude-code/harness-test/SKILL.md +1 -1
  72. package/harness/bundles/java/claude-code/scripts/harness_archive.py +173 -20
  73. package/harness/bundles/java/codebuddy/.harness-build.json +1 -1
  74. package/harness/bundles/java/codebuddy/harness-apidoc/SKILL.md +1 -1
  75. package/harness/bundles/java/codebuddy/harness-archive/SKILL.md +6 -2
  76. package/harness/bundles/java/codebuddy/harness-codebase-map/SKILL.md +1 -1
  77. package/harness/bundles/java/codebuddy/harness-knowledge-ingest/SKILL.md +1 -1
  78. package/harness/bundles/java/codebuddy/harness-knowledge-query/SKILL.md +1 -1
  79. package/harness/bundles/java/codebuddy/harness-package/SKILL.md +1 -1
  80. package/harness/bundles/java/codebuddy/harness-plan/SKILL.md +1 -1
  81. package/harness/bundles/java/codebuddy/harness-pull/SKILL.md +1 -1
  82. package/harness/bundles/java/codebuddy/harness-push/SKILL.md +6 -2
  83. package/harness/bundles/java/codebuddy/harness-review/SKILL.md +1 -1
  84. package/harness/bundles/java/codebuddy/harness-run/SKILL.md +1 -1
  85. package/harness/bundles/java/codebuddy/harness-submit/SKILL.md +1 -1
  86. package/harness/bundles/java/codebuddy/harness-sync/SKILL.md +1 -1
  87. package/harness/bundles/java/codebuddy/harness-test/SKILL.md +1 -1
  88. package/harness/bundles/java/codebuddy/scripts/harness_archive.py +173 -20
  89. package/harness/bundles/java/codex/.harness-build.json +1 -1
  90. package/harness/bundles/java/codex/harness-apidoc/SKILL.md +1 -1
  91. package/harness/bundles/java/codex/harness-archive/SKILL.md +6 -2
  92. package/harness/bundles/java/codex/harness-codebase-map/SKILL.md +1 -1
  93. package/harness/bundles/java/codex/harness-knowledge-ingest/SKILL.md +1 -1
  94. package/harness/bundles/java/codex/harness-knowledge-query/SKILL.md +1 -1
  95. package/harness/bundles/java/codex/harness-package/SKILL.md +1 -1
  96. package/harness/bundles/java/codex/harness-plan/SKILL.md +1 -1
  97. package/harness/bundles/java/codex/harness-pull/SKILL.md +1 -1
  98. package/harness/bundles/java/codex/harness-push/SKILL.md +6 -2
  99. package/harness/bundles/java/codex/harness-review/SKILL.md +1 -1
  100. package/harness/bundles/java/codex/harness-run/SKILL.md +1 -1
  101. package/harness/bundles/java/codex/harness-submit/SKILL.md +1 -1
  102. package/harness/bundles/java/codex/harness-sync/SKILL.md +1 -1
  103. package/harness/bundles/java/codex/harness-test/SKILL.md +1 -1
  104. package/harness/bundles/java/codex/scripts/harness_archive.py +173 -20
  105. package/harness/bundles/java/cursor/.harness-build.json +1 -1
  106. package/harness/bundles/java/cursor/harness-apidoc/SKILL.md +1 -1
  107. package/harness/bundles/java/cursor/harness-archive/SKILL.md +6 -2
  108. package/harness/bundles/java/cursor/harness-codebase-map/SKILL.md +1 -1
  109. package/harness/bundles/java/cursor/harness-knowledge-ingest/SKILL.md +1 -1
  110. package/harness/bundles/java/cursor/harness-knowledge-query/SKILL.md +1 -1
  111. package/harness/bundles/java/cursor/harness-package/SKILL.md +1 -1
  112. package/harness/bundles/java/cursor/harness-plan/SKILL.md +1 -1
  113. package/harness/bundles/java/cursor/harness-pull/SKILL.md +1 -1
  114. package/harness/bundles/java/cursor/harness-push/SKILL.md +6 -2
  115. package/harness/bundles/java/cursor/harness-review/SKILL.md +1 -1
  116. package/harness/bundles/java/cursor/harness-run/SKILL.md +1 -1
  117. package/harness/bundles/java/cursor/harness-submit/SKILL.md +1 -1
  118. package/harness/bundles/java/cursor/harness-sync/SKILL.md +1 -1
  119. package/harness/bundles/java/cursor/harness-test/SKILL.md +1 -1
  120. package/harness/bundles/java/cursor/scripts/harness_archive.py +173 -20
  121. package/harness/manifests/general/claude-code.json +16 -16
  122. package/harness/manifests/general/codebuddy.json +16 -16
  123. package/harness/manifests/general/codex.json +16 -16
  124. package/harness/manifests/general/cursor.json +16 -16
  125. package/harness/manifests/java/claude-code.json +18 -18
  126. package/harness/manifests/java/codebuddy.json +18 -18
  127. package/harness/manifests/java/codex.json +18 -18
  128. package/harness/manifests/java/cursor.json +18 -18
  129. package/hunter-workflow-family.json +5 -5
  130. package/package.json +1 -1
@@ -9041,7 +9041,27 @@ def collect_archive_core_paths(project_root: Path, archive_dir: Path) -> list[st
9041
9041
  return [source.relative_to(root).as_posix() for source, *_ in file_specs]
9042
9042
 
9043
9043
 
9044
- def _archive_source_identity(project_root: Path) -> dict[str, str | None]:
9044
+ def _archive_recorded_commit(archive_dir: Path | None) -> str | None:
9045
+ """The commit the archive itself recorded as its endpoint, if any."""
9046
+ if archive_dir is None:
9047
+ return None
9048
+ try:
9049
+ summary = read_json(archive_dir / "reports" / "final" / "summary-data.json")
9050
+ except (OSError, ValueError, json.JSONDecodeError):
9051
+ return None
9052
+ if not isinstance(summary, dict):
9053
+ return None
9054
+ for key in ("finalCommit", "final_commit", "currentHead", "headCommit"):
9055
+ value = summary.get(key)
9056
+ if isinstance(value, str) and re.fullmatch(r"[0-9a-f]{40}", value.strip()):
9057
+ return value.strip()
9058
+ return None
9059
+
9060
+
9061
+ def _archive_source_identity(
9062
+ project_root: Path,
9063
+ archive_dir: Path | None = None,
9064
+ ) -> dict[str, str | None]:
9045
9065
  def git_value(*args: str) -> str | None:
9046
9066
  try:
9047
9067
  completed = subprocess.run(
@@ -9060,6 +9080,15 @@ def _archive_source_identity(project_root: Path) -> dict[str, str | None]:
9060
9080
  value = completed.stdout.strip()
9061
9081
  return value if completed.returncode == 0 and value else None
9062
9082
 
9083
+ # Prefer the archive's own endpoint over live HEAD so the package stays a
9084
+ # pure function of the sealed directory. Falling back to HEAD keeps older
9085
+ # archives that never recorded a commit working exactly as before.
9086
+ recorded = _archive_recorded_commit(archive_dir)
9087
+ if recorded is not None:
9088
+ return {
9089
+ "commit": recorded,
9090
+ "tree": git_value("rev-parse", f"{recorded}^{{tree}}"),
9091
+ }
9063
9092
  return {
9064
9093
  "commit": git_value("rev-parse", "HEAD"),
9065
9094
  "tree": git_value("rev-parse", "HEAD^{tree}"),
@@ -9244,7 +9273,7 @@ def build_archive_package(
9244
9273
  "profile": "core-v1",
9245
9274
  "change_key": change_key,
9246
9275
  "created_at": _archive_created_at(summary_path),
9247
- "source": _archive_source_identity(project_root),
9276
+ "source": _archive_source_identity(project_root, archive_dir),
9248
9277
  "files": entries,
9249
9278
  }
9250
9279
  manifest_bytes = (
@@ -9482,35 +9511,83 @@ def auto_push_managed_snapshot(project_root: Path) -> dict[str, Any]:
9482
9511
  }
9483
9512
 
9484
9513
 
9514
+ def load_retained_package(project_root: Path, change_key: str) -> dict[str, Any] | None:
9515
+ """A package kept on disk for retry, described by its own pending receipt.
9516
+
9517
+ Retrying is only meaningful against the bytes the server already saw. A
9518
+ rebuild is a different package: the archive directory and the harness both
9519
+ move on, so "retry the same ZIP" has to mean exactly that.
9520
+ """
9521
+ packages = project_root / ".harness" / "state" / "local" / "archive-packages"
9522
+ zip_path = packages / f"{change_key}.zip"
9523
+ receipt_path = packages / f"{change_key}.upload.json"
9524
+ if not zip_path.is_file() or not receipt_path.is_file():
9525
+ return None
9526
+ try:
9527
+ receipt = read_json(receipt_path)
9528
+ except (OSError, ValueError, json.JSONDecodeError):
9529
+ return None
9530
+ if not isinstance(receipt, dict):
9531
+ return None
9532
+ recorded = str(receipt.get("packageSha256") or "")
9533
+ actual = "sha256:" + hashlib.sha256(zip_path.read_bytes()).hexdigest()
9534
+ if recorded and recorded != actual:
9535
+ # The receipt no longer describes the file beside it; refuse to guess.
9536
+ return None
9537
+ return {
9538
+ "schemaVersion": 1,
9539
+ "profile": "core-v1",
9540
+ "changeKey": change_key,
9541
+ "packagePath": str(zip_path),
9542
+ "packageSha256": actual,
9543
+ "manifestSha256": receipt.get("manifestSha256"),
9544
+ "fileCount": receipt.get("fileCount"),
9545
+ "sizeBytes": zip_path.stat().st_size,
9546
+ "paths": list(receipt.get("paths") or []),
9547
+ "knowledgeCandidateCount": receipt.get("knowledgeCandidateCount"),
9548
+ "reused": True,
9549
+ }
9550
+
9551
+
9485
9552
  def auto_push_archive_core(
9486
9553
  project_root: Path,
9487
9554
  archive_dir: Path,
9488
9555
  *,
9489
9556
  change_key: str | None = None,
9490
9557
  extra_entries: dict[str, tuple[str, str, bytes]] | None = None,
9558
+ reuse_retained_package: bool = False,
9491
9559
  ) -> dict[str, Any]:
9492
9560
  """Build and upload one deterministic core ZIP after finalize.
9493
9561
 
9494
9562
  The ZIP and its per-change receipt are always created before auth is
9495
9563
  evaluated. Failures become warnings so archive success is never rolled
9496
9564
  back by missing credentials or a remote outage.
9565
+
9566
+ With ``reuse_retained_package`` a package already kept for retry is uploaded
9567
+ as-is instead of being rebuilt, which is what the retry messages promise.
9497
9568
  """
9498
9569
  project_root = project_root.resolve()
9499
9570
  effective_change_key = change_key or archive_dir.name
9500
- try:
9501
- package = build_archive_package(
9502
- project_root,
9503
- archive_dir,
9504
- effective_change_key,
9505
- extra_entries=extra_entries,
9506
- )
9507
- except (OSError, ValueError, UnicodeDecodeError, json.JSONDecodeError) as exc:
9508
- return {
9509
- "skipped": False,
9510
- "ok": False,
9511
- "reasonCode": "ARCHIVE_PACKAGE_BUILD_FAILED",
9512
- "warning": f"核心归档 ZIP 生成失败:{exc}",
9513
- }
9571
+ package = (
9572
+ load_retained_package(project_root, effective_change_key)
9573
+ if reuse_retained_package
9574
+ else None
9575
+ )
9576
+ if package is None:
9577
+ try:
9578
+ package = build_archive_package(
9579
+ project_root,
9580
+ archive_dir,
9581
+ effective_change_key,
9582
+ extra_entries=extra_entries,
9583
+ )
9584
+ except (OSError, ValueError, UnicodeDecodeError, json.JSONDecodeError) as exc:
9585
+ return {
9586
+ "skipped": False,
9587
+ "ok": False,
9588
+ "reasonCode": "ARCHIVE_PACKAGE_BUILD_FAILED",
9589
+ "warning": f"核心归档 ZIP 生成失败:{exc}",
9590
+ }
9514
9591
  core_paths = list(package["paths"])
9515
9592
  package_path = Path(str(package["packagePath"]))
9516
9593
  try:
@@ -10346,6 +10423,7 @@ def cmd_republish(
10346
10423
  project_root: Path | None,
10347
10424
  dry_run: bool,
10348
10425
  inject_knowledge: bool = True,
10426
+ retry_retained: bool = False,
10349
10427
  ) -> tuple[int, dict[str, Any]]:
10350
10428
  """Rebuild and re-upload the core ZIP for an already sealed archive.
10351
10429
 
@@ -10405,6 +10483,70 @@ def cmd_republish(
10405
10483
  extra_entries = {}
10406
10484
  payload["knowledgeCandidatesInjected"] = "candidates/knowledge.json" in extra_entries
10407
10485
 
10486
+ if retry_retained:
10487
+ retained = load_retained_package(root, change_key)
10488
+ if retained is None:
10489
+ payload.update({
10490
+ "ok": False,
10491
+ "reasonCode": "ARCHIVE_RETAINED_PACKAGE_UNAVAILABLE",
10492
+ "error": (
10493
+ "没有可重试的留存包:需要 "
10494
+ f".harness/state/local/archive-packages/{change_key}.zip 与同名 "
10495
+ ".upload.json 同时存在,且回执记录的 packageSha256 与 ZIP 字节一致。"
10496
+ ),
10497
+ "nextAction": "去掉 --retry-retained 可按封存目录重建一个新包。",
10498
+ })
10499
+ return 1, payload
10500
+ payload["retainedPackage"] = {
10501
+ "packagePath": retained["packagePath"],
10502
+ "packageSha256": retained["packageSha256"],
10503
+ "fileCount": retained["fileCount"],
10504
+ "sizeBytes": retained["sizeBytes"],
10505
+ }
10506
+ durable = read_durable_archive_receipt(root, change_key)
10507
+ stored_sha = str((durable or {}).get("packageSha256") or "")
10508
+ if (
10509
+ durable is not None
10510
+ and str(durable.get("archiveStatus") or "") == "durable"
10511
+ and stored_sha
10512
+ and stored_sha != retained["packageSha256"]
10513
+ ):
10514
+ # Identical bytes stay allowed below — re-uploading the same package
10515
+ # is the documented way to retry a failed knowledge index. Different
10516
+ # bytes are refused by the server, so do not spend the upload.
10517
+ payload.update({
10518
+ "ok": False,
10519
+ "reasonCode": "ARCHIVE_REMOTE_IMMUTABLE_CONFLICT",
10520
+ "remoteReceipt": {
10521
+ "archiveId": durable.get("archiveId"),
10522
+ "packageSha256": stored_sha,
10523
+ },
10524
+ "error": (
10525
+ "留存包与远端已发布的包字节不同,服务端对同一 change key 只保存一个"
10526
+ "不可变包,不接受替换。"
10527
+ ),
10528
+ "nextAction": (
10529
+ "该留存包是一次失败尝试的残留,不是已发布的那一份;"
10530
+ "确认无用后可删除 .zip 与 .upload.json。"
10531
+ ),
10532
+ })
10533
+ return 1, payload
10534
+ if dry_run:
10535
+ payload.update({"ok": True, "reasonCode": "ARCHIVE_RETAINED_PACKAGE_PREVIEW"})
10536
+ return 0, payload
10537
+ result = auto_push_archive_core(
10538
+ root,
10539
+ archive_dir,
10540
+ change_key=change_key,
10541
+ reuse_retained_package=True,
10542
+ )
10543
+ payload["push"] = result
10544
+ payload["ok"] = bool(result.get("ok"))
10545
+ payload["reasonCode"] = result.get("reasonCode")
10546
+ if result.get("warning"):
10547
+ payload.setdefault("warnings", []).append(str(result["warning"]))
10548
+ return 0 if payload["ok"] else 1, payload
10549
+
10408
10550
  # Build once, into a preview path, so the bytes can be compared against any
10409
10551
  # durable receipt before an upload is attempted. The builder refuses to write
10410
10552
  # outside the project, so the preview lands beside the real packages under a
@@ -10479,8 +10621,8 @@ def cmd_republish(
10479
10621
  f"{package['knowledgeCandidateCount']} 条知识候选"
10480
10622
  "(原包上传时还没有 candidates/knowledge.json),因此字节必然不同——"
10481
10623
  "已发布归档无法从客户端追加知识条目,需要平台侧提供重新索引或归档版本化能力。"
10482
- "若只是想重试同一个包(例如知识索引失败),加 --no-knowledge-injection "
10483
- "可重建与封存目录完全一致的字节。"
10624
+ "若只是想重试同一个包(例如知识索引失败),用 --retry-retained "
10625
+ "上传盘上留存的原包字节;重建得不到已发布的字节。"
10484
10626
  if payload.get("knowledgeCandidatesInjected")
10485
10627
  else "本地归档内容与已上传的包不一致,请先确认哪一份才是应保留的事实。"
10486
10628
  )
@@ -10513,6 +10655,7 @@ def cmd_republish_cli(args: argparse.Namespace) -> int:
10513
10655
  project_root=resolve_path(args.project) if args.project else None,
10514
10656
  dry_run=bool(args.dry_run),
10515
10657
  inject_knowledge=not bool(args.no_knowledge_injection),
10658
+ retry_retained=bool(args.retry_retained),
10516
10659
  )
10517
10660
  emit_json(payload)
10518
10661
  return code
@@ -10696,12 +10839,22 @@ def build_parser() -> argparse.ArgumentParser:
10696
10839
  action="store_true",
10697
10840
  help="build the package and report its contents without uploading",
10698
10841
  )
10842
+ p_republish.add_argument(
10843
+ "--retry-retained",
10844
+ action="store_true",
10845
+ help=(
10846
+ "upload the package already kept on disk for retry, byte for byte, "
10847
+ "instead of rebuilding it"
10848
+ ),
10849
+ )
10699
10850
  p_republish.add_argument(
10700
10851
  "--no-knowledge-injection",
10701
10852
  action="store_true",
10702
10853
  help=(
10703
- "rebuild exactly what the sealed archive holds; needed to retry the "
10704
- "same bytes the server already stored"
10854
+ "rebuild without injecting knowledge candidates. Note this does NOT "
10855
+ "reproduce an already-published package: the manifest also binds the "
10856
+ "archive's own commit and the sealed directory may have moved on. To "
10857
+ "retry the exact bytes the server saw, use --retry-retained"
10705
10858
  ),
10706
10859
  )
10707
10860
  p_republish.add_argument("--json", action="store_true", default=True)
@@ -2,9 +2,9 @@
2
2
  "schema_version": 2,
3
3
  "profile": "general",
4
4
  "adapter": "claude-code",
5
- "bundle_version": "0.2.70",
5
+ "bundle_version": "0.2.71",
6
6
  "requires": {
7
- "minimumCliVersion": "0.2.88",
7
+ "minimumCliVersion": "0.2.89",
8
8
  "capabilities": [
9
9
  "sync@2",
10
10
  "rules-sync@1",
@@ -25,7 +25,7 @@
25
25
  "files": [
26
26
  {
27
27
  "path": ".harness-build.json",
28
- "sha256": "ba966d7563aa4c5cf5a170d9af6c80a4a1c87613061d2e8bf7858a1f53001690"
28
+ "sha256": "c64619ffdcd708a3ea1110db40ea3c6686d451d54f78c5d4c11fe5e70de81edb"
29
29
  },
30
30
  {
31
31
  "path": "agents/harness-evaluator.md",
@@ -97,7 +97,7 @@
97
97
  },
98
98
  {
99
99
  "path": "harness-archive/SKILL.md",
100
- "sha256": "cb5686f5044f3dcf580497d8081ae0d7a3742a83c6910dc92d9622b21c4e3e94"
100
+ "sha256": "9f95d23cfbd9b274b771ef0af1bd31f19e35e1d3271a9954215e90f791f5441d"
101
101
  },
102
102
  {
103
103
  "path": "harness-archive/templates/summary-data-template.json",
@@ -113,7 +113,7 @@
113
113
  },
114
114
  {
115
115
  "path": "harness-codebase-map/SKILL.md",
116
- "sha256": "f60acc504b6227448a5879240ed75b5762e587a5908ac0207c558e20f81fc098"
116
+ "sha256": "86f0c786c29f3a43f516bcdd7997117440fe401b09d78a1cfaaffb3d2f070388"
117
117
  },
118
118
  {
119
119
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -153,11 +153,11 @@
153
153
  },
154
154
  {
155
155
  "path": "harness-knowledge-ingest/SKILL.md",
156
- "sha256": "c3a2cdadfb78f0b38503d117def71098a0a2919e3a8eb939e70b4796e3cd84cc"
156
+ "sha256": "767dc944c8dd9b00da231be5a1ac1463fb86c022f68ef44ce88f83572744e379"
157
157
  },
158
158
  {
159
159
  "path": "harness-knowledge-query/SKILL.md",
160
- "sha256": "46a06f2b9610093d11dfbe9d8a27fd8a62129d66c7aa6bb82e759b7893ad9e9b"
160
+ "sha256": "aa5729fe0c21a71006ae32ed54987bade5c1504c059177c4f8a92f7467947a03"
161
161
  },
162
162
  {
163
163
  "path": "harness-plan/checklist.md",
@@ -173,15 +173,15 @@
173
173
  },
174
174
  {
175
175
  "path": "harness-plan/SKILL.md",
176
- "sha256": "79e1c84a92a8bf6370cdc6691dc5cc92bd3e5ff4a720864949a1d3c7de7782a3"
176
+ "sha256": "274692cb56e66d1157d3f57f3c455e5c5ecdafc3688aaa36b8b7a4f52be92e4a"
177
177
  },
178
178
  {
179
179
  "path": "harness-pull/SKILL.md",
180
- "sha256": "29df6f2b5b351c01c97c47db42f835706add2bfe84b4edd0968da1289a2e54c9"
180
+ "sha256": "b722ab5358a3ed4314752b842290a70ecfbf7d9a2c425a2e75117f4a361d2b6d"
181
181
  },
182
182
  {
183
183
  "path": "harness-push/SKILL.md",
184
- "sha256": "ee723583548b7fa73fe113bfbb73d840f144ba1bc059a627cb57289cd8518705"
184
+ "sha256": "43542014ec9328604ae4803e684aa74822d95de39fd33fb73d8c58c733c637da"
185
185
  },
186
186
  {
187
187
  "path": "harness-review/checklist.md",
@@ -197,7 +197,7 @@
197
197
  },
198
198
  {
199
199
  "path": "harness-review/SKILL.md",
200
- "sha256": "a70669bf6deabb442a855535283e22ea6edb6c2e3d50dc65543ab47f7e01f5f3"
200
+ "sha256": "9196558906fbebafccf1ec0665f7c0838353427788027ba99a4cbe7d1605e359"
201
201
  },
202
202
  {
203
203
  "path": "harness-run/checklist.md",
@@ -213,7 +213,7 @@
213
213
  },
214
214
  {
215
215
  "path": "harness-run/SKILL.md",
216
- "sha256": "ad7fefb8891068fd4fbaf1890e21abcbe1a1eed037f3ab1cd751dca56bd651d0"
216
+ "sha256": "624f1732a0cd898f742727b764a862142b644259bf6ca9b9eae2422ccbd014d2"
217
217
  },
218
218
  {
219
219
  "path": "harness-submit/checklist.md",
@@ -225,7 +225,7 @@
225
225
  },
226
226
  {
227
227
  "path": "harness-submit/SKILL.md",
228
- "sha256": "3c222757ff63d702fb69002704931dc6cca246256ff2a2a5a7d093f04410844e"
228
+ "sha256": "a97c7e7741b65961a4ceb083c17e652f8abe25a5cf484836afec70c0f5f0fa59"
229
229
  },
230
230
  {
231
231
  "path": "harness-sync/reference.md",
@@ -233,7 +233,7 @@
233
233
  },
234
234
  {
235
235
  "path": "harness-sync/SKILL.md",
236
- "sha256": "3c755bf5732e7d1f9945b08527668a33cde6e24a593b0636359d89a21418173e"
236
+ "sha256": "6b6a65a97a236dcec674648858d4cfdf21e573224d73e085081fc1e1c8e73a78"
237
237
  },
238
238
  {
239
239
  "path": "harness-test/checklist.md",
@@ -257,7 +257,7 @@
257
257
  },
258
258
  {
259
259
  "path": "harness-test/SKILL.md",
260
- "sha256": "3b2cc724648e75fc310fc09e44a1737c669fc12d5d0933b278c564a72c7fd05a"
260
+ "sha256": "c601b45d073c42fab8c840469a7ed74e2caecc8b9d73f96853b4036b6c07bd54"
261
261
  },
262
262
  {
263
263
  "path": "protocols/archive-report-protocol.md",
@@ -329,7 +329,7 @@
329
329
  },
330
330
  {
331
331
  "path": "scripts/harness_archive.py",
332
- "sha256": "da88a0a922d24d402e3258041e3eb3a2c3d47dc42d930f10550161acf6864179"
332
+ "sha256": "0cd9202ec3eb3b7b1a2dd92d9f6d30565b68df4ba8ec97a63e0f05d06647b039"
333
333
  },
334
334
  {
335
335
  "path": "scripts/harness_change.py",
@@ -2,9 +2,9 @@
2
2
  "schema_version": 2,
3
3
  "profile": "general",
4
4
  "adapter": "codebuddy",
5
- "bundle_version": "0.2.70",
5
+ "bundle_version": "0.2.71",
6
6
  "requires": {
7
- "minimumCliVersion": "0.2.88",
7
+ "minimumCliVersion": "0.2.89",
8
8
  "capabilities": [
9
9
  "sync@2",
10
10
  "rules-sync@1",
@@ -25,7 +25,7 @@
25
25
  "files": [
26
26
  {
27
27
  "path": ".harness-build.json",
28
- "sha256": "9ab6d7c436b5900ab0897bee47f5b21355a09ec516f7167607faa0943b8c36ad"
28
+ "sha256": "58f7090e6c923e57439e94469ade3dfc77b5251f8245ac7b0bf53d55fd2e3a93"
29
29
  },
30
30
  {
31
31
  "path": "agents/harness-evaluator.md",
@@ -97,7 +97,7 @@
97
97
  },
98
98
  {
99
99
  "path": "harness-archive/SKILL.md",
100
- "sha256": "f98a149eb196638fbb531944c3dba7e0ac252867b8269d92a83c0bbbaf930d51"
100
+ "sha256": "67af7e04e65e79fa35821cef4158136ec57b84055911571007b5da5220d1e8de"
101
101
  },
102
102
  {
103
103
  "path": "harness-archive/templates/summary-data-template.json",
@@ -113,7 +113,7 @@
113
113
  },
114
114
  {
115
115
  "path": "harness-codebase-map/SKILL.md",
116
- "sha256": "e941ccfbcf89d5a5aa53c3f49c43b702f8d75c3c6bfb4cf647cf76c6a5e98576"
116
+ "sha256": "138df8165addf7625ba537da81d719c0b823f5c1592473a53744e702ecf66bf0"
117
117
  },
118
118
  {
119
119
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -153,11 +153,11 @@
153
153
  },
154
154
  {
155
155
  "path": "harness-knowledge-ingest/SKILL.md",
156
- "sha256": "82169a60cd3dedc637b072f7941cd64404a6314731233329e33083292ea4751e"
156
+ "sha256": "036eb320c13342615160ccff8d0adddda3fc59c292adf86a66e3f2a7de76da46"
157
157
  },
158
158
  {
159
159
  "path": "harness-knowledge-query/SKILL.md",
160
- "sha256": "13f50e255cb0f48aea12be4ad97ea9d84f260972088ef46aa1a923ef66035fa0"
160
+ "sha256": "8a952722cfb84bea77c5cbfbb737337431419f3d5f0075c337fe56848d3e7628"
161
161
  },
162
162
  {
163
163
  "path": "harness-plan/checklist.md",
@@ -173,15 +173,15 @@
173
173
  },
174
174
  {
175
175
  "path": "harness-plan/SKILL.md",
176
- "sha256": "918cd2e29e85f7404358425764283fa2a0a2e9bb89fef004b3206378a2e32230"
176
+ "sha256": "32dd430ec6ccdc5699111bf60c9674c573f3b9034604135d8c679a83cdd8f414"
177
177
  },
178
178
  {
179
179
  "path": "harness-pull/SKILL.md",
180
- "sha256": "bfdb39724415e798ef181d3dbb2cfd67c23aead486385168d5fbfb7d707084de"
180
+ "sha256": "d5a2c90dce890e2028d3bfd416cd9996d19fc2c3a840a8af555515edda6e9ccd"
181
181
  },
182
182
  {
183
183
  "path": "harness-push/SKILL.md",
184
- "sha256": "b5745430c60a7223938b0651fc03db6987a6ad91b7ea2166745dda09833156da"
184
+ "sha256": "dcee81b52fc4d0160fb9f18db38e2b750fa860d2491427133f9bcc6bc9bf4552"
185
185
  },
186
186
  {
187
187
  "path": "harness-review/checklist.md",
@@ -197,7 +197,7 @@
197
197
  },
198
198
  {
199
199
  "path": "harness-review/SKILL.md",
200
- "sha256": "320d3fa49650b78307c57dab6415596ce23ba4bdd70f6c94acae059f9e733a1d"
200
+ "sha256": "9a20b8095312dd2f64777e0b046c4062de59ae382f5c7851699a95f66fcb002f"
201
201
  },
202
202
  {
203
203
  "path": "harness-run/checklist.md",
@@ -213,7 +213,7 @@
213
213
  },
214
214
  {
215
215
  "path": "harness-run/SKILL.md",
216
- "sha256": "0175fb228d9a813c02f9bdc4bbff8ac873adf3d6c89d79f51e4f8a94be573980"
216
+ "sha256": "35f3108ad0b153ad266f15e325da06a3efe2c823f4fa52f6af0eb1cd38df254a"
217
217
  },
218
218
  {
219
219
  "path": "harness-submit/checklist.md",
@@ -225,7 +225,7 @@
225
225
  },
226
226
  {
227
227
  "path": "harness-submit/SKILL.md",
228
- "sha256": "2d5d90af10f92347c2d88f6bfac01a0337ac2e413be352ba6a23353d5e9a0359"
228
+ "sha256": "7645728203f904c4fea8a40e4963703245717b79815b636c4338531959c8bdb3"
229
229
  },
230
230
  {
231
231
  "path": "harness-sync/reference.md",
@@ -233,7 +233,7 @@
233
233
  },
234
234
  {
235
235
  "path": "harness-sync/SKILL.md",
236
- "sha256": "65fee072033a9ec0865a237f97671b53b744b1c354c7a2313e77421618097662"
236
+ "sha256": "62ec911123b15eab99c18696d5046220e9917be42f36f4eccb6c5419cfdc03b4"
237
237
  },
238
238
  {
239
239
  "path": "harness-test/checklist.md",
@@ -257,7 +257,7 @@
257
257
  },
258
258
  {
259
259
  "path": "harness-test/SKILL.md",
260
- "sha256": "5672497ba8022f01c97edf2991555160bdffadee6697e452dd44e35c7a100112"
260
+ "sha256": "5f2ba52015acbb37a11dc4977b8854e2a20fd82fc71a7a7f2147d99f4ea6bec7"
261
261
  },
262
262
  {
263
263
  "path": "protocols/archive-report-protocol.md",
@@ -329,7 +329,7 @@
329
329
  },
330
330
  {
331
331
  "path": "scripts/harness_archive.py",
332
- "sha256": "da88a0a922d24d402e3258041e3eb3a2c3d47dc42d930f10550161acf6864179"
332
+ "sha256": "0cd9202ec3eb3b7b1a2dd92d9f6d30565b68df4ba8ec97a63e0f05d06647b039"
333
333
  },
334
334
  {
335
335
  "path": "scripts/harness_change.py",
@@ -2,9 +2,9 @@
2
2
  "schema_version": 2,
3
3
  "profile": "general",
4
4
  "adapter": "codex",
5
- "bundle_version": "0.2.70",
5
+ "bundle_version": "0.2.71",
6
6
  "requires": {
7
- "minimumCliVersion": "0.2.88",
7
+ "minimumCliVersion": "0.2.89",
8
8
  "capabilities": [
9
9
  "sync@2",
10
10
  "rules-sync@1",
@@ -25,7 +25,7 @@
25
25
  "files": [
26
26
  {
27
27
  "path": ".harness-build.json",
28
- "sha256": "dd479b5fcd5a1236b5683af40030c8b7d067b9ab6dc671dbbf77ce81fb81afc2"
28
+ "sha256": "6c54b49a4e5014c6c78864fb675056d36d94ee39e8c6098dd9a0a787b7f894d4"
29
29
  },
30
30
  {
31
31
  "path": "CONTEXT.md",
@@ -85,7 +85,7 @@
85
85
  },
86
86
  {
87
87
  "path": "harness-archive/SKILL.md",
88
- "sha256": "4b551607562363cbb662eee0ffcb939c33dbed37366ec45c2aff7d6f1212c580"
88
+ "sha256": "9cd34ad7b974c98efea37dc23b795ecda5e9c1794539fedd8d6678028a8d5f84"
89
89
  },
90
90
  {
91
91
  "path": "harness-archive/templates/summary-data-template.json",
@@ -101,7 +101,7 @@
101
101
  },
102
102
  {
103
103
  "path": "harness-codebase-map/SKILL.md",
104
- "sha256": "0d0c3510715f99909773cc582d028c217af2c236ebbc8ade22199e9a1656ad4c"
104
+ "sha256": "ec01fa097b93151d35a5dd10aa0646db9cc6ac9a34671cf2e14f8b378824d3c4"
105
105
  },
106
106
  {
107
107
  "path": "harness-codebase-map/templates/ARCHITECTURE.md",
@@ -141,11 +141,11 @@
141
141
  },
142
142
  {
143
143
  "path": "harness-knowledge-ingest/SKILL.md",
144
- "sha256": "eeb0b0bdb6528575b0fb3f37ddc0baf8cc4938ed915f67e58e0cb2d6fedb11fb"
144
+ "sha256": "f39e3786c416bf732b1246f5c819b2dadbb7a880a7184288caec8459d1f2798f"
145
145
  },
146
146
  {
147
147
  "path": "harness-knowledge-query/SKILL.md",
148
- "sha256": "7958bef0647ff4557ee8e33e1910803a0c4d23ed94dbfac81801a48c061f0143"
148
+ "sha256": "e74554f9f7a37c2b07cd85a336809cefd3be2bf4f8700e3e0c30f6d0af9d35b2"
149
149
  },
150
150
  {
151
151
  "path": "harness-plan/checklist.md",
@@ -161,15 +161,15 @@
161
161
  },
162
162
  {
163
163
  "path": "harness-plan/SKILL.md",
164
- "sha256": "6f849d750ffdee4a2b82c8eb3e565c42f148f86790267e157a5c5f953ae54e53"
164
+ "sha256": "7ad037fdf3114e11f58f1c856866031a4a5afd978778bdc8f726b2160b1dd716"
165
165
  },
166
166
  {
167
167
  "path": "harness-pull/SKILL.md",
168
- "sha256": "d6f1431ebc6490f5ef7e2521579b8d78e23a8d9ee6ffc6de3a977cfc9d3fbe8d"
168
+ "sha256": "298cac3b6609b2bed3a1e7467ced44439a11d6152c684dbc4c590871d4860352"
169
169
  },
170
170
  {
171
171
  "path": "harness-push/SKILL.md",
172
- "sha256": "268eb9e32a13b218f7518c11e9e8756d5ff2644efb524557601d644bd4d27aa6"
172
+ "sha256": "5f0ce23430423200301247f51125e46a1f7465fbd77cf21dfdbb5225b40c8b3f"
173
173
  },
174
174
  {
175
175
  "path": "harness-review/checklist.md",
@@ -185,7 +185,7 @@
185
185
  },
186
186
  {
187
187
  "path": "harness-review/SKILL.md",
188
- "sha256": "cf46e8604dfb9ae77f7f77b6c34f69d7e1a69cf531567874852f0661fbb7885d"
188
+ "sha256": "475f234088ad1b6a1586fcf0f2469c382ddf7fbc53f8bf7b93cde11aa76b2115"
189
189
  },
190
190
  {
191
191
  "path": "harness-run/checklist.md",
@@ -201,7 +201,7 @@
201
201
  },
202
202
  {
203
203
  "path": "harness-run/SKILL.md",
204
- "sha256": "f02aa1216d56c0c9945e6e80944abc17880194267803a2386de3dde4e64baa62"
204
+ "sha256": "53572f53366010ef89e60e3d2da460d38b17403849fc580ecb7e1180c2d3dd15"
205
205
  },
206
206
  {
207
207
  "path": "harness-submit/checklist.md",
@@ -213,7 +213,7 @@
213
213
  },
214
214
  {
215
215
  "path": "harness-submit/SKILL.md",
216
- "sha256": "4a497395dcae5604cfabc8d9542f9bd2dd0e5be988629d533288bcbdefd16bc5"
216
+ "sha256": "0d5063dbb18e50c066ef20122d14cc28fa3dd4c24fbf311c9783d228a4e1b042"
217
217
  },
218
218
  {
219
219
  "path": "harness-sync/reference.md",
@@ -221,7 +221,7 @@
221
221
  },
222
222
  {
223
223
  "path": "harness-sync/SKILL.md",
224
- "sha256": "65ba5fb5da56283cdb6517f9b4a0b778ed2f72a0749e7812a1e29043202f6914"
224
+ "sha256": "9dd94fe26ef1e8fa695ac26683928c32f6aa39ad5a237d648dd50bd5bf585a0d"
225
225
  },
226
226
  {
227
227
  "path": "harness-test/checklist.md",
@@ -245,7 +245,7 @@
245
245
  },
246
246
  {
247
247
  "path": "harness-test/SKILL.md",
248
- "sha256": "a5268e6e13c898331967fd7696cd656ee43fe91d6ce07e113cb9adf960bcbc38"
248
+ "sha256": "504536b6746456f24e38143affe5a213c62af9aca919bb8c97d4d827eec8d2f3"
249
249
  },
250
250
  {
251
251
  "path": "protocols/archive-report-protocol.md",
@@ -317,7 +317,7 @@
317
317
  },
318
318
  {
319
319
  "path": "scripts/harness_archive.py",
320
- "sha256": "da88a0a922d24d402e3258041e3eb3a2c3d47dc42d930f10550161acf6864179"
320
+ "sha256": "0cd9202ec3eb3b7b1a2dd92d9f6d30565b68df4ba8ec97a63e0f05d06647b039"
321
321
  },
322
322
  {
323
323
  "path": "scripts/harness_change.py",