blun-king-cli 9.1.567 → 9.1.569

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 (262) hide show
  1. package/agent-spine-plugin/.claude-plugin/marketplace.json +1 -1
  2. package/agent-spine-plugin/.claude-plugin/plugin.json +1 -1
  3. package/agent-spine-plugin/.codex-plugin/plugin.json +2 -1
  4. package/agent-spine-plugin/CHANGELOG.md +1581 -0
  5. package/agent-spine-plugin/README.md +30 -4
  6. package/agent-spine-plugin/blun.plugin.json +3 -3
  7. package/agent-spine-plugin/docs/acceptance.md +61 -0
  8. package/agent-spine-plugin/docs/assignment-continuation.md +48 -0
  9. package/agent-spine-plugin/docs/host-integration.md +178 -0
  10. package/agent-spine-plugin/docs/preflight-recall.md +69 -0
  11. package/agent-spine-plugin/docs/preservation-contract.md +53 -0
  12. package/agent-spine-plugin/docs/quality-gates.md +50 -0
  13. package/agent-spine-plugin/docs/releasing.md +85 -0
  14. package/agent-spine-plugin/docs/session-timeline.md +251 -0
  15. package/agent-spine-plugin/docs/source-roots.md +113 -0
  16. package/agent-spine-plugin/docs/structured-completion.md +67 -0
  17. package/agent-spine-plugin/docs/world-model.md +94 -0
  18. package/agent-spine-plugin/hooks/codex.json +2 -2
  19. package/agent-spine-plugin/hooks/hooks.json +1 -1
  20. package/agent-spine-plugin/hooks/version.json +1 -1
  21. package/agent-spine-plugin/package.json +13 -3
  22. package/agent-spine-plugin/scripts/check-codex-install.js +226 -0
  23. package/agent-spine-plugin/scripts/check-hosts.js +14 -5
  24. package/agent-spine-plugin/scripts/check-install-hook.js +226 -0
  25. package/agent-spine-plugin/scripts/check-install-selfstarter.js +154 -0
  26. package/agent-spine-plugin/scripts/check-install.js +478 -0
  27. package/agent-spine-plugin/scripts/check-line-budget.js +58 -0
  28. package/agent-spine-plugin/scripts/check-syntax.js +29 -0
  29. package/agent-spine-plugin/scripts/github-actions.js +11 -0
  30. package/agent-spine-plugin/scripts/hermetic-process.js +183 -0
  31. package/agent-spine-plugin/scripts/release-check.js +145 -0
  32. package/agent-spine-plugin/scripts/run-acceptance.js +19 -0
  33. package/agent-spine-plugin/scripts/run-checks.js +47 -0
  34. package/agent-spine-plugin/scripts/run-tests-hermetic.js +89 -0
  35. package/agent-spine-plugin/skills/agent-spine/SKILL.md +16 -2
  36. package/agent-spine-plugin/spine-example/1-identity.md +12 -0
  37. package/agent-spine-plugin/spine-example/2-voice.md +6 -0
  38. package/agent-spine-plugin/spine-example/3-conduct.md +8 -0
  39. package/agent-spine-plugin/spine-example/4-history.md +4 -0
  40. package/agent-spine-plugin/src/cli-agent.js +296 -0
  41. package/agent-spine-plugin/src/cli-attention.js +95 -0
  42. package/agent-spine-plugin/src/cli-autonomy.js +36 -0
  43. package/agent-spine-plugin/src/cli-common.js +71 -0
  44. package/agent-spine-plugin/src/cli-continuity.js +116 -0
  45. package/agent-spine-plugin/src/cli-core.js +128 -0
  46. package/agent-spine-plugin/src/cli-diagnostics.js +291 -0
  47. package/agent-spine-plugin/src/cli-host.js +21 -0
  48. package/agent-spine-plugin/src/cli-learning.js +305 -0
  49. package/agent-spine-plugin/src/cli-premortem.js +16 -0
  50. package/agent-spine-plugin/src/cli-sharing.js +230 -0
  51. package/agent-spine-plugin/src/cli.js +40 -1350
  52. package/agent-spine-plugin/src/codex-reader-launcher.js +182 -0
  53. package/agent-spine-plugin/src/hook.js +185 -567
  54. package/agent-spine-plugin/src/index.js +16 -2
  55. package/agent-spine-plugin/src/lib/acceptance.js +113 -11
  56. package/agent-spine-plugin/src/lib/action-lesson-recall.js +53 -0
  57. package/agent-spine-plugin/src/lib/attention-context.js +167 -0
  58. package/agent-spine-plugin/src/lib/attention-events.js +113 -0
  59. package/agent-spine-plugin/src/lib/attention-privacy.js +72 -0
  60. package/agent-spine-plugin/src/lib/attention-schema.js +164 -0
  61. package/agent-spine-plugin/src/lib/attention-storage.js +93 -0
  62. package/agent-spine-plugin/src/lib/attention.js +9 -600
  63. package/agent-spine-plugin/src/lib/audit-premortem.js +223 -0
  64. package/agent-spine-plugin/src/lib/audit.js +56 -6
  65. package/agent-spine-plugin/src/lib/autonomy-policy.js +110 -0
  66. package/agent-spine-plugin/src/lib/autonomy-store.js +202 -0
  67. package/agent-spine-plugin/src/lib/autonomy.js +8 -0
  68. package/agent-spine-plugin/src/lib/briefing.js +67 -4
  69. package/agent-spine-plugin/src/lib/catalog-document-read.js +51 -0
  70. package/agent-spine-plugin/src/lib/catalog.js +1 -1
  71. package/agent-spine-plugin/src/lib/codex-installation.js +231 -0
  72. package/agent-spine-plugin/src/lib/codex-skill-installation.js +211 -0
  73. package/agent-spine-plugin/src/lib/context.js +3 -1
  74. package/agent-spine-plugin/src/lib/delivery-agent-usage.js +224 -0
  75. package/agent-spine-plugin/src/lib/delivery-assignment.js +220 -0
  76. package/agent-spine-plugin/src/lib/delivery-command-actions.js +453 -0
  77. package/agent-spine-plugin/src/lib/delivery-knowledge.js +78 -0
  78. package/agent-spine-plugin/src/lib/delivery-premortem-binding.js +107 -0
  79. package/agent-spine-plugin/src/lib/delivery-premortem-closure.js +171 -0
  80. package/agent-spine-plugin/src/lib/delivery-premortem-codec.js +45 -0
  81. package/agent-spine-plugin/src/lib/delivery-premortem-correction.js +101 -0
  82. package/agent-spine-plugin/src/lib/delivery-premortem-file.js +21 -0
  83. package/agent-spine-plugin/src/lib/delivery-premortem-index.js +493 -0
  84. package/agent-spine-plugin/src/lib/delivery-premortem-inspection.js +37 -0
  85. package/agent-spine-plugin/src/lib/delivery-premortem-recovery.js +120 -0
  86. package/agent-spine-plugin/src/lib/delivery-premortem-rejection.js +65 -0
  87. package/agent-spine-plugin/src/lib/delivery-premortem-results.js +28 -0
  88. package/agent-spine-plugin/src/lib/delivery-premortem-session-guard.js +46 -0
  89. package/agent-spine-plugin/src/lib/delivery-premortem-write-ledger.js +285 -0
  90. package/agent-spine-plugin/src/lib/delivery-premortem.js +499 -0
  91. package/agent-spine-plugin/src/lib/delivery-shell-heredoc.js +115 -0
  92. package/agent-spine-plugin/src/lib/delivery-shell-substitutions.js +111 -0
  93. package/agent-spine-plugin/src/lib/delivery-shell-wrapper.js +64 -0
  94. package/agent-spine-plugin/src/lib/delivery-target.js +73 -0
  95. package/agent-spine-plugin/src/lib/delivery-verification.js +445 -0
  96. package/agent-spine-plugin/src/lib/documents.js +27 -5
  97. package/agent-spine-plugin/src/lib/filesystem-retry.js +2 -0
  98. package/agent-spine-plugin/src/lib/gateway-common.js +68 -0
  99. package/agent-spine-plugin/src/lib/gateway-control.js +302 -0
  100. package/agent-spine-plugin/src/lib/gateway-delivery.js +103 -0
  101. package/agent-spine-plugin/src/lib/gateway-execution.js +350 -0
  102. package/agent-spine-plugin/src/lib/gateway-host-lifecycle.js +185 -0
  103. package/agent-spine-plugin/src/lib/gateway-inspection.js +85 -0
  104. package/agent-spine-plugin/src/lib/gateway-knowledge.js +129 -0
  105. package/agent-spine-plugin/src/lib/gateway-policy-provenance.js +197 -0
  106. package/agent-spine-plugin/src/lib/gateway-premortem-disposition.js +82 -0
  107. package/agent-spine-plugin/src/lib/gateway-premortem.js +363 -0
  108. package/agent-spine-plugin/src/lib/gateway-runs.js +300 -0
  109. package/agent-spine-plugin/src/lib/gateway-runtime-identity.js +31 -0
  110. package/agent-spine-plugin/src/lib/gateway-runtime-records.js +21 -0
  111. package/agent-spine-plugin/src/lib/gateway-runtime.js +18 -1623
  112. package/agent-spine-plugin/src/lib/gateway-state-transaction.js +356 -0
  113. package/agent-spine-plugin/src/lib/gateway-state.js +342 -0
  114. package/agent-spine-plugin/src/lib/hook-artifact-guards.js +356 -0
  115. package/agent-spine-plugin/src/lib/hook-audit.js +16 -2
  116. package/agent-spine-plugin/src/lib/hook-briefing-use.js +68 -0
  117. package/agent-spine-plugin/src/lib/hook-context.js +424 -0
  118. package/agent-spine-plugin/src/lib/hook-final-message.js +26 -0
  119. package/agent-spine-plugin/src/lib/hook-input.js +27 -0
  120. package/agent-spine-plugin/src/lib/hook-output.js +140 -0
  121. package/agent-spine-plugin/src/lib/hook-premortem.js +257 -0
  122. package/agent-spine-plugin/src/lib/hook-process-advisory.js +37 -0
  123. package/agent-spine-plugin/src/lib/hook-protection.js +95 -0
  124. package/agent-spine-plugin/src/lib/hook-stop-verification.js +84 -0
  125. package/agent-spine-plugin/src/lib/hook-timeline.js +91 -0
  126. package/agent-spine-plugin/src/lib/identifier-analysis.js +446 -0
  127. package/agent-spine-plugin/src/lib/indexed-memory.js +23 -6
  128. package/agent-spine-plugin/src/lib/knowledge-evidence.js +431 -0
  129. package/agent-spine-plugin/src/lib/learning-applications.js +441 -0
  130. package/agent-spine-plugin/src/lib/learning-candidates.js +274 -0
  131. package/agent-spine-plugin/src/lib/learning-context.js +130 -0
  132. package/agent-spine-plugin/src/lib/learning-delivery-contracts.js +310 -0
  133. package/agent-spine-plugin/src/lib/learning-evaluation-contracts.js +350 -0
  134. package/agent-spine-plugin/src/lib/learning-evaluation-registration.js +372 -0
  135. package/agent-spine-plugin/src/lib/learning-evaluation-revocation.js +292 -0
  136. package/agent-spine-plugin/src/lib/learning-evidence-contracts.js +321 -0
  137. package/agent-spine-plugin/src/lib/learning-findings.js +458 -0
  138. package/agent-spine-plugin/src/lib/learning-measurement-contracts.js +285 -0
  139. package/agent-spine-plugin/src/lib/learning-measurements.js +265 -0
  140. package/agent-spine-plugin/src/lib/learning-outcome-contracts.js +165 -0
  141. package/agent-spine-plugin/src/lib/learning-outcomes.js +343 -0
  142. package/agent-spine-plugin/src/lib/learning-reconciliation.js +290 -0
  143. package/agent-spine-plugin/src/lib/learning-retry-contracts.js +188 -0
  144. package/agent-spine-plugin/src/lib/learning-schema.js +229 -0
  145. package/agent-spine-plugin/src/lib/learning-scope-targets.js +424 -0
  146. package/agent-spine-plugin/src/lib/learning-state-upgrade.js +477 -0
  147. package/agent-spine-plugin/src/lib/learning-status-configuration.js +476 -0
  148. package/agent-spine-plugin/src/lib/learning-storage.js +203 -0
  149. package/agent-spine-plugin/src/lib/learning-trial-recovery.js +218 -0
  150. package/agent-spine-plugin/src/lib/learning-validation-contracts.js +375 -0
  151. package/agent-spine-plugin/src/lib/learning-validation-renewal.js +298 -0
  152. package/agent-spine-plugin/src/lib/learning-validation-runtime.js +234 -0
  153. package/agent-spine-plugin/src/lib/learning.js +36 -6923
  154. package/agent-spine-plugin/src/lib/lesson-recall-session.js +172 -0
  155. package/agent-spine-plugin/src/lib/mcp-autonomy-tools.js +37 -0
  156. package/agent-spine-plugin/src/lib/mcp-delivery-completion.js +124 -0
  157. package/agent-spine-plugin/src/lib/mcp-delivery-tools.js +45 -0
  158. package/agent-spine-plugin/src/lib/mcp-premortem.js +68 -0
  159. package/agent-spine-plugin/src/lib/mcp-runtime.js +269 -0
  160. package/agent-spine-plugin/src/lib/mcp-source-context.js +51 -0
  161. package/agent-spine-plugin/src/lib/mcp-timeline-tools.js +164 -0
  162. package/agent-spine-plugin/src/lib/mcp-world-tools.js +52 -0
  163. package/agent-spine-plugin/src/lib/owned-file-lock.js +30 -10
  164. package/agent-spine-plugin/src/lib/project-portfolio.js +176 -0
  165. package/agent-spine-plugin/src/lib/selfstarter-core.js +382 -0
  166. package/agent-spine-plugin/src/lib/selfstarter-jobs.js +149 -0
  167. package/agent-spine-plugin/src/lib/selfstarter-lease.js +204 -0
  168. package/agent-spine-plugin/src/lib/selfstarter-policy.js +90 -0
  169. package/agent-spine-plugin/src/lib/selfstarter-workspace.js +111 -0
  170. package/agent-spine-plugin/src/lib/selfstarter.js +11 -911
  171. package/agent-spine-plugin/src/lib/session-timeline-auth.js +316 -0
  172. package/agent-spine-plugin/src/lib/session-timeline-codex.js +58 -0
  173. package/agent-spine-plugin/src/lib/session-timeline-contract.js +48 -0
  174. package/agent-spine-plugin/src/lib/session-timeline-enrollment-source.js +41 -0
  175. package/agent-spine-plugin/src/lib/session-timeline-enrollment-storage.js +132 -0
  176. package/agent-spine-plugin/src/lib/session-timeline-enrollment-transport.js +17 -0
  177. package/agent-spine-plugin/src/lib/session-timeline-enrollment.js +500 -0
  178. package/agent-spine-plugin/src/lib/session-timeline-event-extract.js +157 -0
  179. package/agent-spine-plugin/src/lib/session-timeline-host-origin.js +74 -0
  180. package/agent-spine-plugin/src/lib/session-timeline-host-receipt.js +117 -0
  181. package/agent-spine-plugin/src/lib/session-timeline-invocation.js +201 -0
  182. package/agent-spine-plugin/src/lib/session-timeline-king.js +79 -0
  183. package/agent-spine-plugin/src/lib/session-timeline-prior.js +59 -0
  184. package/agent-spine-plugin/src/lib/session-timeline-provider.js +34 -0
  185. package/agent-spine-plugin/src/lib/session-timeline-query.js +55 -0
  186. package/agent-spine-plugin/src/lib/session-timeline-results.js +31 -0
  187. package/agent-spine-plugin/src/lib/session-timeline-root.js +11 -0
  188. package/agent-spine-plugin/src/lib/session-timeline-search.js +82 -0
  189. package/agent-spine-plugin/src/lib/session-timeline-sid-acl.js +217 -0
  190. package/agent-spine-plugin/src/lib/session-timeline-source.js +83 -0
  191. package/agent-spine-plugin/src/lib/session-timeline-state.js +45 -0
  192. package/agent-spine-plugin/src/lib/session-timeline-transport.js +50 -0
  193. package/agent-spine-plugin/src/lib/session-timeline-windows-acl.js +148 -0
  194. package/agent-spine-plugin/src/lib/session-timeline.js +453 -0
  195. package/agent-spine-plugin/src/lib/source-roots.js +69 -136
  196. package/agent-spine-plugin/src/lib/source-tree-scan.js +178 -0
  197. package/agent-spine-plugin/src/lib/task-knowledge-context.js +78 -0
  198. package/agent-spine-plugin/src/lib/timeline-tool-guard.js +202 -0
  199. package/agent-spine-plugin/src/lib/world-knowledge.js +249 -0
  200. package/agent-spine-plugin/src/lib/world-model.js +278 -0
  201. package/agent-spine-plugin/src/mcp.js +20 -161
  202. package/agent-spine-plugin/src/version.js +1 -1
  203. package/agent-spine-plugin/src/worker.js +22 -5
  204. package/bin/agent-resume-snapshot.cjs +2 -2
  205. package/bin/agentspine-king-goal-inbox.mjs +111 -0
  206. package/bin/agentspine-king-goal-intake.mjs +106 -0
  207. package/bin/baseline-skill-performance-policy.cjs +1 -16
  208. package/bin/core-bootstrap.js +2 -0
  209. package/bin/curiosity-scout-policy.cjs +5 -1
  210. package/bin/input-draft-persistence.cjs +2 -2
  211. package/bin/king-tui-function-contract.json +33 -0
  212. package/bin/launcher-restart-policy.cjs +150 -0
  213. package/bin/launcher-runtime.js +56 -44
  214. package/bin/managed-context-startup-policy.cjs +27 -0
  215. package/bin/managed-plugin-selection.cjs +116 -0
  216. package/bin/mistake-relevance-policy.cjs +1 -1
  217. package/bin/observer-hooks.cjs +14 -0
  218. package/bin/oversized-context-offload-policy.cjs +86 -0
  219. package/bin/plugin-bootstrap.js +7 -40
  220. package/bin/proactive-compaction-policy.cjs +1 -1
  221. package/bin/provider-model-refresh-deadline.cjs +53 -0
  222. package/bin/provider-model-refresh-policy.cjs +107 -0
  223. package/bin/release-artifact-freeze-policy.cjs +30 -0
  224. package/bin/repeated-user-message-projection.cjs +3 -126
  225. package/bin/research-page-result.cjs +74 -0
  226. package/bin/runtime-exit-ledger.cjs +1 -0
  227. package/bin/session-compaction-policy.cjs +84 -0
  228. package/bin/skill-listing-performance-policy.cjs +2 -2
  229. package/bin/standard-tools-bootstrap.js +0 -37
  230. package/bin/subagent-skill-policy.cjs +3 -1
  231. package/bin/telegram-approval-relay.cjs +12 -7
  232. package/bin/telegram-private-conversation-policy.cjs +3 -2
  233. package/bin/telegram-queue-handoff-policy.cjs +24 -0
  234. package/bin/thinking-activity-status-policy.cjs +1 -1
  235. package/bin/thinking-only-guard.cjs +16 -12
  236. package/bin/tool-call-loop-policy.cjs +0 -2
  237. package/bin/tool-result-offload-policy.cjs +11 -2
  238. package/bin/tui-functional-contract.cjs +55 -0
  239. package/bin/update-notice.js +18 -14
  240. package/bin/user-message-offload-policy.cjs +1 -1
  241. package/bin/user-prompt-hook-origin-policy.cjs +34 -0
  242. package/bin/windows-node-crash-dump.cjs +110 -0
  243. package/blun.mjs +2517 -1048
  244. package/codebase-index/codebase_index.py +4 -3
  245. package/package.json +3 -17
  246. package/standard-skills/research-evidence/SKILL.md +39 -0
  247. package/standard-skills/research-evidence/references/evidence-format.md +82 -0
  248. package/standard-skills/research-evidence/scripts/evidence-collection.cjs +254 -0
  249. package/standard-skills/research-evidence/scripts/score-report.cjs +112 -0
  250. package/standard-skills/web-lesen/SKILL.md +37 -22
  251. package/standard-skills/web-lesen/scripts/crawl_public.py +376 -0
  252. package/telegram-plugin/DELIVERY.md +36 -0
  253. package/telegram-plugin/bin/telegram-approval-relay.cjs +13 -7
  254. package/telegram-plugin/bin/telegram-launcher-status-queue.cjs +122 -0
  255. package/telegram-plugin/bin/telegram-private-conversation-policy.cjs +3 -2
  256. package/telegram-plugin/bin/telegram-reply-parts.cjs +149 -0
  257. package/telegram-plugin/dist/bridge.mjs +7 -56
  258. package/telegram-plugin/dist/mcp-server.mjs +33 -4
  259. package/agent-spine-plugin/skill/SKILL.md +0 -76
  260. package/bin/mnemo-connect-heartbeat.cjs +0 -204
  261. package/bin/mnemo-tool-agent-policy.cjs +0 -22
  262. package/telegram-plugin/bin/telegram-mnemo-capture.cjs +0 -297
@@ -0,0 +1,350 @@
1
+ import { join } from "node:path";
2
+ import {
3
+ METRIC_DIRECTIONS, SCOPE_FIELDS, ID_RE, DIGEST_RE, EVALUATION_SCHEMAS, PAIRED_EVALUATIONS,
4
+ ROOT_BOUND_EVALUATIONS, INITIAL_TRIAL_EVALUATIONS, TARGET_BOUND_EVALUATIONS, DEADLINE_BOUND_EVALUATIONS, TRIAL_RETRY_EVALUATIONS, COMPARABLE_TRIAL_RETRY_EVALUATIONS,
5
+ STALENESS_BOUND_EVALUATIONS, PROMOTION_BOUND_EVALUATIONS, CANDIDATE_ADMISSION_EVALUATIONS, CANDIDATE_EVIDENCE_BOUND_EVALUATIONS, BLOCKING_DEFECT_BOUND_EVALUATIONS, EVIDENCE_SOURCE_BOUND_EVALUATIONS,
6
+ EVIDENCE_SOURCE_ATTESTED_EVALUATIONS, CANDIDATE_EVIDENCE_LINEAGE_EVALUATIONS, DELIVERABLE_APPLICATIONS, INITIAL_TRIAL_APPLICATIONS, TARGET_BOUND_APPLICATIONS, DEADLINE_BOUND_APPLICATIONS,
7
+ TRIAL_FAILURE_REVOCATION_REASONS
8
+ } from "./learning-schema.js";
9
+ import {
10
+ exactScope, digest, learningTargetForCandidate, storedLearningTargetStructure, learningTargetMatchesCandidate
11
+ } from "./learning-scope-targets.js";
12
+ import {
13
+ storedInitialTrialPlanStructure, storedCompletionPolicyStructure, storedStalenessPolicyStructure, storedBlockingDefectPolicyStructure, storedEvidenceSourcePolicyStructure
14
+ } from "./learning-measurement-contracts.js";
15
+ import {
16
+ storedCandidateAdmissionStructure, storedTrialRetryStructure
17
+ } from "./learning-evidence-contracts.js";
18
+
19
+ export function evaluationPayload({ id, learningId, scope, metric, benchmark, evaluatorIds, evaluatorRoots, thresholds, pairing,
20
+ initialTrials, target, completionPolicy, stalenessPolicy, blockingDefectPolicy, evidenceSourcePolicy,
21
+ candidateAdmission, retry, registeredAt, expiresAt,
22
+ schema = "agentspine.learning-evaluation/v1" }) {
23
+ return {
24
+ schema, id, learningId, scope, metric, benchmark,
25
+ evaluatorIds,
26
+ ...(ROOT_BOUND_EVALUATIONS.has(schema) ? { evaluatorRoots } : {}),
27
+ thresholds,
28
+ ...(PAIRED_EVALUATIONS.has(schema) ? { pairing } : {}),
29
+ ...(INITIAL_TRIAL_EVALUATIONS.has(schema) ? { initialTrials } : {}),
30
+ ...(TARGET_BOUND_EVALUATIONS.has(schema) ? { target } : {}),
31
+ ...(DEADLINE_BOUND_EVALUATIONS.has(schema) ? { completionPolicy } : {}),
32
+ ...(STALENESS_BOUND_EVALUATIONS.has(schema) ? { stalenessPolicy } : {}),
33
+ ...(BLOCKING_DEFECT_BOUND_EVALUATIONS.has(schema) ? { blockingDefectPolicy } : {}),
34
+ ...(EVIDENCE_SOURCE_BOUND_EVALUATIONS.has(schema) ? { evidenceSourcePolicy } : {}),
35
+ ...(CANDIDATE_ADMISSION_EVALUATIONS.has(schema) ? { candidateAdmission } : {}),
36
+ ...(TRIAL_RETRY_EVALUATIONS.has(schema) ? { retry } : {}),
37
+ registeredAt, expiresAt, authority: "context-only"
38
+ };
39
+ }
40
+
41
+ export function storedEvaluationStructure(contract) {
42
+ if (!contract || typeof contract !== "object" || Array.isArray(contract)) return false;
43
+ const payload = evaluationPayload(contract);
44
+ return EVALUATION_SCHEMAS.has(contract.schema)
45
+ && ID_RE.test(contract.id || "") && ID_RE.test(contract.learningId || "")
46
+ && SCOPE_FIELDS.every((field) => contract.scope?.[field] === null || ID_RE.test(contract.scope?.[field] || ""))
47
+ && typeof contract.metric?.name === "string" && contract.metric.name.length > 0
48
+ && METRIC_DIRECTIONS.has(contract.metric?.direction)
49
+ && [contract.benchmark?.taskDigest, contract.benchmark?.datasetDigest, contract.benchmark?.protocolDigest]
50
+ .every((value) => DIGEST_RE.test(value || ""))
51
+ && Number.isInteger(contract.benchmark?.minCases) && contract.benchmark.minCases >= 1
52
+ && Array.isArray(contract.evaluatorIds) && contract.evaluatorIds.length >= 2
53
+ && new Set(contract.evaluatorIds).size === contract.evaluatorIds.length
54
+ && contract.evaluatorIds.every((id) => ID_RE.test(id || ""))
55
+ && Number.isFinite(contract.thresholds?.minImprovement) && contract.thresholds.minImprovement >= 0
56
+ && contract.thresholds.minImprovement <= 1
57
+ && Number.isFinite(contract.thresholds?.regressionTolerance) && contract.thresholds.regressionTolerance >= 0
58
+ && contract.thresholds.regressionTolerance <= 1
59
+ && Number.isInteger(contract.thresholds?.beforeReceipts) && contract.thresholds.beforeReceipts >= 2
60
+ && Number.isInteger(contract.thresholds?.afterReceipts) && contract.thresholds.afterReceipts >= 1
61
+ && (!(COMPARABLE_TRIAL_RETRY_EVALUATIONS.has(contract.schema)
62
+ || PROMOTION_BOUND_EVALUATIONS.has(contract.schema))
63
+ || (Number.isFinite(contract.thresholds?.minConfidence)
64
+ && contract.thresholds.minConfidence >= 0.5 && contract.thresholds.minConfidence <= 1
65
+ && Number.isInteger(contract.thresholds?.minEvidence)
66
+ && contract.thresholds.minEvidence >= 2 && contract.thresholds.minEvidence <= 10))
67
+ && (!ROOT_BOUND_EVALUATIONS.has(contract.schema)
68
+ || (Array.isArray(contract.evaluatorRoots)
69
+ && contract.evaluatorRoots.length === contract.evaluatorIds.length
70
+ && contract.evaluatorRoots.every((root) => ID_RE.test(root?.evaluatorId || "")
71
+ && DIGEST_RE.test(root?.principalDigest || "") && root?.authority === "context-only")
72
+ && new Set(contract.evaluatorRoots.map((root) => root.evaluatorId)).size === contract.evaluatorRoots.length
73
+ && new Set(contract.evaluatorRoots.map((root) => root.principalDigest)).size === contract.evaluatorRoots.length
74
+ && contract.evaluatorRoots.map((root) => root.evaluatorId).sort().join("\0") === [...contract.evaluatorIds].sort().join("\0")))
75
+ && (!PAIRED_EVALUATIONS.has(contract.schema)
76
+ || (contract.pairing?.mode === "same-evaluator"
77
+ && contract.pairing?.maxOutcomesPerEvaluatorPerPhase === 1
78
+ && contract.pairing?.matchMeasurementKind === true
79
+ && contract.pairing?.matchCaseCount === true
80
+ && contract.pairing?.authority === "context-only"))
81
+ && (!INITIAL_TRIAL_EVALUATIONS.has(contract.schema)
82
+ || storedInitialTrialPlanStructure(contract.initialTrials, contract))
83
+ && (!TARGET_BOUND_EVALUATIONS.has(contract.schema)
84
+ || (storedLearningTargetStructure(contract.target) && contract.target.learningId === contract.learningId))
85
+ && (!DEADLINE_BOUND_EVALUATIONS.has(contract.schema)
86
+ || storedCompletionPolicyStructure(contract.completionPolicy))
87
+ && (!STALENESS_BOUND_EVALUATIONS.has(contract.schema)
88
+ || storedStalenessPolicyStructure(contract.stalenessPolicy))
89
+ && (!BLOCKING_DEFECT_BOUND_EVALUATIONS.has(contract.schema)
90
+ || storedBlockingDefectPolicyStructure(contract.blockingDefectPolicy))
91
+ && (!EVIDENCE_SOURCE_BOUND_EVALUATIONS.has(contract.schema)
92
+ || storedEvidenceSourcePolicyStructure(contract.evidenceSourcePolicy))
93
+ && (!CANDIDATE_ADMISSION_EVALUATIONS.has(contract.schema)
94
+ || (storedCandidateAdmissionStructure(contract.candidateAdmission)
95
+ && contract.candidateAdmission.schema === (CANDIDATE_EVIDENCE_LINEAGE_EVALUATIONS.has(contract.schema)
96
+ ? "agentspine.learning-candidate-admission/v4"
97
+ : EVIDENCE_SOURCE_ATTESTED_EVALUATIONS.has(contract.schema)
98
+ ? "agentspine.learning-candidate-admission/v3"
99
+ : CANDIDATE_EVIDENCE_BOUND_EVALUATIONS.has(contract.schema)
100
+ ? "agentspine.learning-candidate-admission/v2"
101
+ : "agentspine.learning-candidate-admission/v1")
102
+ && contract.candidateAdmission.learningId === contract.learningId
103
+ && contract.candidateAdmission.targetDigest === contract.target?.digest
104
+ && contract.candidateAdmission.scopeDigest === digest(contract.scope)
105
+ && contract.candidateAdmission.minConfidence === contract.thresholds?.minConfidence
106
+ && contract.candidateAdmission.minEvidence === contract.thresholds?.minEvidence
107
+ && contract.candidateAdmission.admittedAt === contract.registeredAt))
108
+ && (!TRIAL_RETRY_EVALUATIONS.has(contract.schema)
109
+ || (storedTrialRetryStructure(contract.retry)
110
+ && contract.retry.learningId === contract.learningId
111
+ && contract.retry.targetDigest === contract.target?.digest
112
+ && contract.retry.scopeDigest === digest(contract.scope)
113
+ && contract.retry.admittedAt === contract.registeredAt))
114
+ && Number.isFinite(new Date(contract.registeredAt).getTime())
115
+ && Number.isFinite(new Date(contract.expiresAt).getTime())
116
+ && new Date(contract.expiresAt).getTime() > new Date(contract.registeredAt).getTime()
117
+ && contract.authority === "context-only" && contract.digest === digest(payload);
118
+ }
119
+
120
+ export function applicationPayload({ id, learningId, scope, preflightReceiptId, promptDigest,
121
+ preflightBriefingDigest, sessionBriefingDigest, sessionId, projectedAt, deliveryExpiresAt, expiresAt,
122
+ revalidationAdmission, initialAdmission, outcomeExpiresAt, completionPolicyDigest,
123
+ schema = "agentspine.learning-application/v1" }) {
124
+ return {
125
+ schema, id, learningId, scope,
126
+ preflightReceiptId, promptDigest, preflightBriefingDigest, sessionBriefingDigest,
127
+ ...(DELIVERABLE_APPLICATIONS.has(schema)
128
+ ? { sessionId, deliveryExpiresAt } : {}),
129
+ ...(["agentspine.learning-application/v3", "agentspine.learning-application/v4"].includes(schema)
130
+ ? { revalidationAdmission } : {}),
131
+ ...(INITIAL_TRIAL_APPLICATIONS.has(schema) ? { initialAdmission } : {}),
132
+ ...(DEADLINE_BOUND_APPLICATIONS.has(schema) ? { outcomeExpiresAt, completionPolicyDigest } : {}),
133
+ projectedAt, expiresAt, authority: "context-only"
134
+ };
135
+ }
136
+
137
+ export function storedApplicationStructure(receipt) {
138
+ if (!receipt || typeof receipt !== "object" || Array.isArray(receipt)) return false;
139
+ const payload = applicationPayload(receipt);
140
+ const legacy = receipt.schema === "agentspine.learning-application/v1";
141
+ const delivered = receipt.schema === "agentspine.learning-application/v2";
142
+ const admitted = ["agentspine.learning-application/v3", "agentspine.learning-application/v4"].includes(receipt.schema);
143
+ const initialAdmitted = INITIAL_TRIAL_APPLICATIONS.has(receipt.schema);
144
+ const targetBound = TARGET_BOUND_APPLICATIONS.has(receipt.schema);
145
+ const deadlineBound = DEADLINE_BOUND_APPLICATIONS.has(receipt.schema);
146
+ const trialBound = receipt.schema === "agentspine.learning-application/v4";
147
+ const admission = receipt.revalidationAdmission;
148
+ const initial = receipt.initialAdmission;
149
+ return (legacy || delivered || admitted || initialAdmitted) && ID_RE.test(receipt.id || "")
150
+ && ID_RE.test(receipt.learningId || "") && ID_RE.test(receipt.preflightReceiptId || "")
151
+ && SCOPE_FIELDS.every((field) => receipt.scope?.[field] === null || ID_RE.test(receipt.scope?.[field] || ""))
152
+ && [receipt.promptDigest, receipt.preflightBriefingDigest, receipt.sessionBriefingDigest]
153
+ .every((value) => /^[a-f0-9]{64}$/.test(value || ""))
154
+ && Number.isFinite(new Date(receipt.projectedAt).getTime())
155
+ && Number.isFinite(new Date(receipt.expiresAt).getTime())
156
+ && new Date(receipt.expiresAt).getTime() >= new Date(receipt.projectedAt).getTime()
157
+ && (!(delivered || admitted || initialAdmitted) || (ID_RE.test(receipt.sessionId || "")
158
+ && Number.isFinite(new Date(receipt.deliveryExpiresAt).getTime())
159
+ && new Date(receipt.deliveryExpiresAt).getTime() >= new Date(receipt.projectedAt).getTime()
160
+ && new Date(receipt.deliveryExpiresAt).getTime() <= new Date(receipt.expiresAt).getTime()))
161
+ && (!admitted || (ID_RE.test(admission?.revalidationWindowId || "")
162
+ && DIGEST_RE.test(admission?.revalidationWindowDigest || "")
163
+ && Number.isInteger(admission?.slot) && admission.slot >= 1 && admission.slot <= 10
164
+ && DIGEST_RE.test(admission?.evaluatorRootDigest || "")
165
+ && (!trialBound || (ID_RE.test(admission?.evaluatorId || "") && ID_RE.test(admission?.runId || "")
166
+ && DIGEST_RE.test(admission?.trialDigest || "")))
167
+ && admission?.authority === "context-only"))
168
+ && (!initialAdmitted || (ID_RE.test(initial?.evaluationId || "")
169
+ && DIGEST_RE.test(initial?.evaluationDigest || "")
170
+ && Number.isInteger(initial?.slot) && initial.slot >= 1 && initial.slot <= 10
171
+ && ID_RE.test(initial?.evaluatorId || "") && DIGEST_RE.test(initial?.evaluatorRootDigest || "")
172
+ && ID_RE.test(initial?.runId || "") && DIGEST_RE.test(initial?.trialDigest || "")
173
+ && (!targetBound || DIGEST_RE.test(initial?.targetDigest || ""))
174
+ && initial?.authority === "context-only"))
175
+ && (!deadlineBound || (Number.isFinite(new Date(receipt.outcomeExpiresAt).getTime())
176
+ && new Date(receipt.outcomeExpiresAt).getTime() >= new Date(receipt.deliveryExpiresAt).getTime()
177
+ && new Date(receipt.outcomeExpiresAt).getTime() <= new Date(receipt.expiresAt).getTime()
178
+ && DIGEST_RE.test(receipt.completionPolicyDigest || "")))
179
+ && receipt.authority === "context-only" && receipt.digest === digest(payload);
180
+ }
181
+
182
+ export function initialAdmissionsMatchState(state) {
183
+ const groups = new Map();
184
+ for (const receipt of state.applications.filter((entry) => INITIAL_TRIAL_APPLICATIONS.has(entry.schema))) {
185
+ const admission = receipt.initialAdmission;
186
+ const contract = state.evaluations.find((entry) => entry.id === admission.evaluationId
187
+ && entry.digest === admission.evaluationDigest);
188
+ const candidate = state.candidates.find((entry) => entry.id === receipt.learningId)
189
+ || state.history.find((entry) => entry.kind === "learning-candidate"
190
+ && entry.value?.id === receipt.learningId)?.value;
191
+ const trial = contract?.initialTrials?.after?.[admission.slot - 1];
192
+ if (!candidate || !contract || (receipt.schema === "agentspine.learning-application/v5"
193
+ ? contract.schema !== "agentspine.learning-evaluation/v8"
194
+ : receipt.schema === "agentspine.learning-application/v6"
195
+ ? contract.schema !== "agentspine.learning-evaluation/v9"
196
+ : !DEADLINE_BOUND_EVALUATIONS.has(contract.schema))
197
+ || contract.learningId !== receipt.learningId || contract.initialTrials.mode !== "first-admitted-trials"
198
+ || (TARGET_BOUND_APPLICATIONS.has(receipt.schema)
199
+ && (admission.targetDigest !== contract.target.digest || !learningTargetMatchesCandidate(contract.target, candidate)))
200
+ || (DEADLINE_BOUND_APPLICATIONS.has(receipt.schema)
201
+ && (receipt.completionPolicyDigest !== contract.completionPolicy.digest
202
+ || receipt.deliveryExpiresAt !== new Date(Math.min(new Date(receipt.expiresAt).getTime(),
203
+ new Date(receipt.projectedAt).getTime() + contract.completionPolicy.deliveryTimeoutMs)).toISOString()
204
+ || receipt.outcomeExpiresAt !== new Date(Math.min(new Date(receipt.expiresAt).getTime(),
205
+ new Date(receipt.projectedAt).getTime() + contract.completionPolicy.outcomeTimeoutMs)).toISOString()))
206
+ || admission.slot > contract.initialTrials.requiredTrials
207
+ || admission.evaluatorId !== trial?.evaluatorId
208
+ || admission.evaluatorRootDigest !== trial?.evaluatorRootDigest
209
+ || admission.runId !== trial?.runId || admission.trialDigest !== trial?.trialDigest
210
+ || !exactScope(receipt.scope, contract.scope)
211
+ || new Date(receipt.projectedAt).getTime() < new Date(contract.registeredAt).getTime()
212
+ || new Date(receipt.projectedAt).getTime() > new Date(contract.expiresAt).getTime()) return false;
213
+ const key = `${contract.id}\0${contract.digest}`;
214
+ if (!groups.has(key)) groups.set(key, []);
215
+ groups.get(key).push(receipt);
216
+ }
217
+ return [...groups.values()].every((receipts) => {
218
+ const ordered = [...receipts].sort((a, b) => a.initialAdmission.slot - b.initialAdmission.slot);
219
+ return new Set(ordered.map((receipt) => receipt.initialAdmission.slot)).size === ordered.length
220
+ && ordered.every((receipt, index) => receipt.initialAdmission.slot === index + 1);
221
+ });
222
+ }
223
+
224
+ export function trialFailurePayload({ id, learningId, evaluationId, evaluationDigest, applicationId, applicationDigest,
225
+ slot, trialDigest, targetDigest, completionPolicyDigest, failure, deadline, observedAt }) {
226
+ return {
227
+ schema: "agentspine.learning-trial-failure/v1",
228
+ id,
229
+ learningId,
230
+ evaluationId,
231
+ evaluationDigest,
232
+ applicationId,
233
+ applicationDigest,
234
+ slot,
235
+ trialDigest,
236
+ targetDigest,
237
+ completionPolicyDigest,
238
+ failure,
239
+ deadline,
240
+ observedAt,
241
+ authority: "context-only"
242
+ };
243
+ }
244
+
245
+ export function storedTrialFailureStructure(receipt) {
246
+ if (!receipt || typeof receipt !== "object" || Array.isArray(receipt)) return false;
247
+ const payload = trialFailurePayload(receipt);
248
+ return receipt.schema === "agentspine.learning-trial-failure/v1"
249
+ && [receipt.id, receipt.learningId, receipt.evaluationId, receipt.applicationId].every((value) => ID_RE.test(value || ""))
250
+ && [receipt.evaluationDigest, receipt.applicationDigest, receipt.trialDigest, receipt.targetDigest,
251
+ receipt.completionPolicyDigest].every((value) => DIGEST_RE.test(value || ""))
252
+ && Number.isInteger(receipt.slot) && receipt.slot >= 1 && receipt.slot <= 10
253
+ && ["delivery-timeout", "outcome-timeout"].includes(receipt.failure)
254
+ && Number.isFinite(new Date(receipt.deadline).getTime())
255
+ && Number.isFinite(new Date(receipt.observedAt).getTime())
256
+ && new Date(receipt.observedAt).getTime() > new Date(receipt.deadline).getTime()
257
+ && receipt.authority === "context-only" && receipt.digest === digest(payload);
258
+ }
259
+
260
+ export function trialFailureMatchesState(state, receipt) {
261
+ const evaluation = state.evaluations.find((entry) => entry.id === receipt.evaluationId
262
+ && entry.digest === receipt.evaluationDigest && entry.learningId === receipt.learningId);
263
+ const application = state.applications.find((entry) => entry.id === receipt.applicationId
264
+ && entry.digest === receipt.applicationDigest && entry.learningId === receipt.learningId);
265
+ const candidate = state.candidates.find((entry) => entry.id === receipt.learningId);
266
+ if (!evaluation || !DEADLINE_BOUND_EVALUATIONS.has(evaluation.schema)
267
+ || !application || application.schema !== "agentspine.learning-application/v7"
268
+ || application.initialAdmission.evaluationId !== evaluation.id
269
+ || application.initialAdmission.evaluationDigest !== evaluation.digest
270
+ || application.initialAdmission.slot !== receipt.slot
271
+ || application.initialAdmission.trialDigest !== receipt.trialDigest
272
+ || application.initialAdmission.targetDigest !== receipt.targetDigest
273
+ || receipt.targetDigest !== evaluation.target.digest
274
+ || application.completionPolicyDigest !== receipt.completionPolicyDigest
275
+ || receipt.completionPolicyDigest !== evaluation.completionPolicy.digest
276
+ || candidate?.status !== "rolled-back"
277
+ || candidate.rollback?.trialFailureId !== receipt.id
278
+ || candidate.rollback?.trialFailureDigest !== receipt.digest) return false;
279
+ const delivery = state.deliveries.find((entry) => entry.applicationId === application.id);
280
+ const outcome = state.outcomes.find((entry) => entry.applicationId === application.id
281
+ && entry.evaluationId === evaluation.id && entry.phase === "after");
282
+ return receipt.failure === "delivery-timeout"
283
+ ? receipt.deadline === application.deliveryExpiresAt && !delivery
284
+ : receipt.deadline === application.outcomeExpiresAt && Boolean(delivery) && !outcome;
285
+ }
286
+
287
+ export function trialFailureRevocationPayload({ id, learningId, evaluationId, evaluationDigest,
288
+ evaluatorBindingDigest, applicationId, applicationDigest, trialFailureId, trialFailureDigest,
289
+ targetDigest, scopeDigest, reasonCode, reasonDigest, revokedAt }) {
290
+ return {
291
+ schema: "agentspine.learning-trial-failure-revocation/v1",
292
+ id,
293
+ learningId,
294
+ evaluationId,
295
+ evaluationDigest,
296
+ evaluatorBindingDigest,
297
+ applicationId,
298
+ applicationDigest,
299
+ trialFailureId,
300
+ trialFailureDigest,
301
+ targetDigest,
302
+ scopeDigest,
303
+ reasonCode,
304
+ reasonDigest,
305
+ revokedAt,
306
+ retryPolicy: "fresh-candidate-and-contract-required",
307
+ authority: "context-only"
308
+ };
309
+ }
310
+
311
+ export function storedTrialFailureRevocationStructure(receipt) {
312
+ if (!receipt || typeof receipt !== "object" || Array.isArray(receipt)) return false;
313
+ const payload = trialFailureRevocationPayload(receipt);
314
+ return receipt.schema === "agentspine.learning-trial-failure-revocation/v1"
315
+ && Object.keys(receipt).length === 18
316
+ && Object.keys(receipt).every((field) => ["schema", "id", "learningId", "evaluationId",
317
+ "evaluationDigest", "evaluatorBindingDigest", "applicationId", "applicationDigest",
318
+ "trialFailureId", "trialFailureDigest", "targetDigest", "scopeDigest", "reasonCode",
319
+ "reasonDigest", "revokedAt", "retryPolicy", "authority", "digest"].includes(field))
320
+ && [receipt.id, receipt.learningId, receipt.evaluationId, receipt.applicationId,
321
+ receipt.trialFailureId].every((value) => ID_RE.test(value || ""))
322
+ && [receipt.evaluationDigest, receipt.evaluatorBindingDigest, receipt.applicationDigest,
323
+ receipt.trialFailureDigest, receipt.targetDigest, receipt.scopeDigest,
324
+ receipt.reasonDigest].every((value) => DIGEST_RE.test(value || ""))
325
+ && TRIAL_FAILURE_REVOCATION_REASONS.has(receipt.reasonCode)
326
+ && Number.isFinite(new Date(receipt.revokedAt).getTime())
327
+ && receipt.retryPolicy === "fresh-candidate-and-contract-required"
328
+ && receipt.authority === "context-only" && receipt.digest === digest(payload);
329
+ }
330
+
331
+ export function trialFailureRevocationMatchesState(state, receipt) {
332
+ const failure = state.trialFailures.find((entry) => entry.id === receipt.trialFailureId
333
+ && entry.digest === receipt.trialFailureDigest);
334
+ const evaluation = state.evaluations.find((entry) => entry.id === receipt.evaluationId
335
+ && entry.digest === receipt.evaluationDigest);
336
+ const binding = state.evaluationBindings.find((entry) => entry.evaluationId === receipt.evaluationId
337
+ && entry.evaluationDigest === receipt.evaluationDigest);
338
+ const application = state.applications.find((entry) => entry.id === receipt.applicationId
339
+ && entry.digest === receipt.applicationDigest);
340
+ const candidate = state.candidates.find((entry) => entry.id === receipt.learningId);
341
+ return Boolean(failure && evaluation && binding && application && candidate
342
+ && trialFailureMatchesState(state, failure)
343
+ && failure.learningId === candidate.id && failure.evaluationId === evaluation.id
344
+ && failure.applicationId === application.id
345
+ && evaluation.learningId === candidate.id && application.learningId === candidate.id
346
+ && binding.digest === receipt.evaluatorBindingDigest
347
+ && failure.targetDigest === receipt.targetDigest
348
+ && learningTargetForCandidate(candidate).digest === receipt.targetDigest
349
+ && digest(application.scope) === receipt.scopeDigest && exactScope(application.scope, evaluation.scope));
350
+ }