sherpa-skill 2.0.6 → 2.0.7

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 (246) hide show
  1. package/.agents/plugins/marketplace.json +11 -0
  2. package/.agents/skills/sherpa/SKILL.md +161 -0
  3. package/.agents/skills/sherpa/commands/README.md +43 -0
  4. package/.agents/skills/sherpa/commands/manifest.json +589 -0
  5. package/.agents/skills/sherpa/commands/sherpa-research.md +147 -0
  6. package/.agents/skills/sherpa/core/commands/router.py +171 -0
  7. package/.agents/skills/sherpa/core/configuration/manager.py +504 -0
  8. package/.agents/skills/sherpa/core/ideas/engine.py +564 -0
  9. package/.agents/skills/sherpa/docs/commands/README.md +96 -0
  10. package/.agents/skills/sherpa/docs/configuration/runtime-verification.md +64 -0
  11. package/.agents/skills/sherpa/rules/demo-preparation-rules.md +543 -0
  12. package/.agents/skills/sherpa/rules/engineering-rules.md +221 -0
  13. package/.agents/skills/sherpa/rules/final-audit-rules.md +824 -0
  14. package/.agents/skills/sherpa/rules/implementation-rules.md +127 -0
  15. package/.agents/skills/sherpa/rules/judge-rules.md +443 -0
  16. package/.agents/skills/sherpa/rules/mentor-rules.md +109 -0
  17. package/.agents/skills/sherpa/rules/postmortem-rules.md +69 -0
  18. package/.agents/skills/sherpa/rules/presentation-rules.md +783 -0
  19. package/.agents/skills/sherpa/rules/red-team-rules.md +185 -0
  20. package/.agents/skills/sherpa/rules/research-rules.md +184 -0
  21. package/.agents/skills/sherpa/rules/score-optimization-rules.md +355 -0
  22. package/.agents/skills/sherpa/rules/scoring-rules.md +216 -0
  23. package/.agents/skills/sherpa/rules/submission-rules.md +41 -0
  24. package/.agents/skills/sherpa/rules/testing-security-rules.md +87 -0
  25. package/.agents/skills/sherpa/rules/ux-rules.md +89 -0
  26. package/.agents/skills/sherpa/src/config_manager.py +474 -0
  27. package/.agents/skills/sherpa/src/verification.py +458 -0
  28. package/.agents/skills/sherpa/templates/audit-finding.md +20 -0
  29. package/.agents/skills/sherpa/templates/claim-audit.md +15 -0
  30. package/.agents/skills/sherpa/templates/configuration/hackathon.json +21 -0
  31. package/.agents/skills/sherpa/templates/configuration/integrations.env.example +3 -0
  32. package/.agents/skills/sherpa/templates/configuration/project.env.example +12 -0
  33. package/.agents/skills/sherpa/templates/configuration/providers.env.example +4 -0
  34. package/.agents/skills/sherpa/templates/configuration/settings.json +22 -0
  35. package/.agents/skills/sherpa/templates/consistency-audit.md +17 -0
  36. package/.agents/skills/sherpa/templates/decision-log.md +18 -0
  37. package/.agents/skills/sherpa/templates/demo-checkpoint.md +42 -0
  38. package/.agents/skills/sherpa/templates/demo-evidence.md +32 -0
  39. package/.agents/skills/sherpa/templates/demo-finding.md +112 -0
  40. package/.agents/skills/sherpa/templates/demo-flow.md +52 -0
  41. package/.agents/skills/sherpa/templates/demo-plan.md +265 -0
  42. package/.agents/skills/sherpa/templates/demo-verification.md +57 -0
  43. package/.agents/skills/sherpa/templates/final-audit.md +387 -0
  44. package/.agents/skills/sherpa/templates/final-risk.md +17 -0
  45. package/.agents/skills/sherpa/templates/final-verification.md +57 -0
  46. package/.agents/skills/sherpa/templates/gap-analysis.md +113 -0
  47. package/.agents/skills/sherpa/templates/idea-comparison.md +129 -0
  48. package/.agents/skills/sherpa/templates/idea-evaluation.md +251 -0
  49. package/.agents/skills/sherpa/templates/implementation-plan.md +96 -0
  50. package/.agents/skills/sherpa/templates/implementation-task.md +57 -0
  51. package/.agents/skills/sherpa/templates/improvement-candidate.md +135 -0
  52. package/.agents/skills/sherpa/templates/improvement.md +18 -0
  53. package/.agents/skills/sherpa/templates/incident.md +20 -0
  54. package/.agents/skills/sherpa/templates/judge-criterion.md +41 -0
  55. package/.agents/skills/sherpa/templates/judge-question.md +41 -0
  56. package/.agents/skills/sherpa/templates/judge-session.md +125 -0
  57. package/.agents/skills/sherpa/templates/judge-simulation.md +264 -0
  58. package/.agents/skills/sherpa/templates/lesson.md +14 -0
  59. package/.agents/skills/sherpa/templates/postmortem.md +87 -0
  60. package/.agents/skills/sherpa/templates/presentation-evidence.md +33 -0
  61. package/.agents/skills/sherpa/templates/presentation-plan.md +349 -0
  62. package/.agents/skills/sherpa/templates/presentation-qna.md +29 -0
  63. package/.agents/skills/sherpa/templates/presentation-risk.md +42 -0
  64. package/.agents/skills/sherpa/templates/presentation-verification.md +57 -0
  65. package/.agents/skills/sherpa/templates/project-plan.md +242 -0
  66. package/.agents/skills/sherpa/templates/project-state.md +84 -0
  67. package/.agents/skills/sherpa/templates/red-team-finding.md +73 -0
  68. package/.agents/skills/sherpa/templates/red-team-review.md +105 -0
  69. package/.agents/skills/sherpa/templates/red-team-scenario.md +43 -0
  70. package/.agents/skills/sherpa/templates/red-team-verification.md +31 -0
  71. package/.agents/skills/sherpa/templates/repo-analysis.md +204 -0
  72. package/.agents/skills/sherpa/templates/requirement-audit.md +15 -0
  73. package/.agents/skills/sherpa/templates/research-comparison.md +124 -0
  74. package/.agents/skills/sherpa/templates/research-plan.md +93 -0
  75. package/.agents/skills/sherpa/templates/research-report.md +92 -0
  76. package/.agents/skills/sherpa/templates/research-source.md +77 -0
  77. package/.agents/skills/sherpa/templates/score-optimization-plan.md +197 -0
  78. package/.agents/skills/sherpa/templates/security-finding.md +45 -0
  79. package/.agents/skills/sherpa/templates/security-review.md +64 -0
  80. package/.agents/skills/sherpa/templates/slide-claim.md +47 -0
  81. package/.agents/skills/sherpa/templates/slide-plan.md +127 -0
  82. package/.agents/skills/sherpa/templates/submission-artifact.md +15 -0
  83. package/.agents/skills/sherpa/templates/submission-checklist.md +24 -0
  84. package/.agents/skills/sherpa/templates/submission-field.md +14 -0
  85. package/.agents/skills/sherpa/templates/submission-link.md +14 -0
  86. package/.agents/skills/sherpa/templates/submission-plan.md +31 -0
  87. package/.agents/skills/sherpa/templates/submission-readiness.md +18 -0
  88. package/.agents/skills/sherpa/templates/submission-requirement.md +12 -0
  89. package/.agents/skills/sherpa/templates/submission-risk.md +14 -0
  90. package/.agents/skills/sherpa/templates/submission-snapshot.md +20 -0
  91. package/.agents/skills/sherpa/templates/submission-verification.md +12 -0
  92. package/.agents/skills/sherpa/templates/test-plan.md +59 -0
  93. package/.agents/skills/sherpa/templates/test-result.md +46 -0
  94. package/.agents/skills/sherpa/templates/timeline.md +11 -0
  95. package/.agents/skills/sherpa/templates/ux-finding.md +56 -0
  96. package/.agents/skills/sherpa/templates/ux-flow.md +46 -0
  97. package/.agents/skills/sherpa/templates/ux-review.md +113 -0
  98. package/.agents/skills/sherpa/templates/ux-verification.md +32 -0
  99. package/.agents/skills/sherpa/workflows/configuration.md +23 -0
  100. package/.agents/skills/sherpa/workflows/demo-preparation.md +399 -0
  101. package/.agents/skills/sherpa/workflows/final-audit.md +713 -0
  102. package/.agents/skills/sherpa/workflows/idea-evaluation.md +239 -0
  103. package/.agents/skills/sherpa/workflows/idea-intelligence.md +69 -0
  104. package/.agents/skills/sherpa/workflows/implementation.md +42 -0
  105. package/.agents/skills/sherpa/workflows/init.md +102 -0
  106. package/.agents/skills/sherpa/workflows/judge-simulation.md +408 -0
  107. package/.agents/skills/sherpa/workflows/lifecycle.md +51 -0
  108. package/.agents/skills/sherpa/workflows/next.md +96 -0
  109. package/.agents/skills/sherpa/workflows/postmortem.md +76 -0
  110. package/.agents/skills/sherpa/workflows/presentation.md +522 -0
  111. package/.agents/skills/sherpa/workflows/project-planning.md +327 -0
  112. package/.agents/skills/sherpa/workflows/red-team.md +373 -0
  113. package/.agents/skills/sherpa/workflows/research.md +142 -0
  114. package/.agents/skills/sherpa/workflows/score-optimization.md +276 -0
  115. package/.agents/skills/sherpa/workflows/status.md +107 -0
  116. package/.agents/skills/sherpa/workflows/submission.md +46 -0
  117. package/.agents/skills/sherpa/workflows/testing-security.md +44 -0
  118. package/.agents/skills/sherpa/workflows/ux-review.md +59 -0
  119. package/.claude-plugin/marketplace.json +21 -0
  120. package/.claude-plugin/plugin.json +13 -0
  121. package/.codex-plugin/plugin.json +13 -0
  122. package/GEMINI.md +3 -0
  123. package/README.md +11 -7
  124. package/SKILL.md +161 -0
  125. package/distribution/cli/sherpa +1 -1
  126. package/gemini-extension.json +7 -0
  127. package/package.json +31 -3
  128. package/plugin.json +20 -0
  129. package/qwen-extension.json +6 -0
  130. package/skills/sherpa/SKILL.md +161 -0
  131. package/skills/sherpa/commands/README.md +43 -0
  132. package/skills/sherpa/commands/manifest.json +589 -0
  133. package/skills/sherpa/commands/sherpa-research.md +147 -0
  134. package/skills/sherpa/core/commands/router.py +171 -0
  135. package/skills/sherpa/core/configuration/manager.py +504 -0
  136. package/skills/sherpa/core/ideas/engine.py +564 -0
  137. package/skills/sherpa/docs/commands/README.md +96 -0
  138. package/skills/sherpa/docs/configuration/runtime-verification.md +64 -0
  139. package/skills/sherpa/rules/demo-preparation-rules.md +543 -0
  140. package/skills/sherpa/rules/engineering-rules.md +221 -0
  141. package/skills/sherpa/rules/final-audit-rules.md +824 -0
  142. package/skills/sherpa/rules/implementation-rules.md +127 -0
  143. package/skills/sherpa/rules/judge-rules.md +443 -0
  144. package/skills/sherpa/rules/mentor-rules.md +109 -0
  145. package/skills/sherpa/rules/postmortem-rules.md +69 -0
  146. package/skills/sherpa/rules/presentation-rules.md +783 -0
  147. package/skills/sherpa/rules/red-team-rules.md +185 -0
  148. package/skills/sherpa/rules/research-rules.md +184 -0
  149. package/skills/sherpa/rules/score-optimization-rules.md +355 -0
  150. package/skills/sherpa/rules/scoring-rules.md +216 -0
  151. package/skills/sherpa/rules/submission-rules.md +41 -0
  152. package/skills/sherpa/rules/testing-security-rules.md +87 -0
  153. package/skills/sherpa/rules/ux-rules.md +89 -0
  154. package/skills/sherpa/src/config_manager.py +474 -0
  155. package/skills/sherpa/src/verification.py +458 -0
  156. package/skills/sherpa/templates/audit-finding.md +20 -0
  157. package/skills/sherpa/templates/claim-audit.md +15 -0
  158. package/skills/sherpa/templates/configuration/hackathon.json +21 -0
  159. package/skills/sherpa/templates/configuration/integrations.env.example +3 -0
  160. package/skills/sherpa/templates/configuration/project.env.example +12 -0
  161. package/skills/sherpa/templates/configuration/providers.env.example +4 -0
  162. package/skills/sherpa/templates/configuration/settings.json +22 -0
  163. package/skills/sherpa/templates/consistency-audit.md +17 -0
  164. package/skills/sherpa/templates/decision-log.md +18 -0
  165. package/skills/sherpa/templates/demo-checkpoint.md +42 -0
  166. package/skills/sherpa/templates/demo-evidence.md +32 -0
  167. package/skills/sherpa/templates/demo-finding.md +112 -0
  168. package/skills/sherpa/templates/demo-flow.md +52 -0
  169. package/skills/sherpa/templates/demo-plan.md +265 -0
  170. package/skills/sherpa/templates/demo-verification.md +57 -0
  171. package/skills/sherpa/templates/final-audit.md +387 -0
  172. package/skills/sherpa/templates/final-risk.md +17 -0
  173. package/skills/sherpa/templates/final-verification.md +57 -0
  174. package/skills/sherpa/templates/gap-analysis.md +113 -0
  175. package/skills/sherpa/templates/idea-comparison.md +129 -0
  176. package/skills/sherpa/templates/idea-evaluation.md +251 -0
  177. package/skills/sherpa/templates/implementation-plan.md +96 -0
  178. package/skills/sherpa/templates/implementation-task.md +57 -0
  179. package/skills/sherpa/templates/improvement-candidate.md +135 -0
  180. package/skills/sherpa/templates/improvement.md +18 -0
  181. package/skills/sherpa/templates/incident.md +20 -0
  182. package/skills/sherpa/templates/judge-criterion.md +41 -0
  183. package/skills/sherpa/templates/judge-question.md +41 -0
  184. package/skills/sherpa/templates/judge-session.md +125 -0
  185. package/skills/sherpa/templates/judge-simulation.md +264 -0
  186. package/skills/sherpa/templates/lesson.md +14 -0
  187. package/skills/sherpa/templates/postmortem.md +87 -0
  188. package/skills/sherpa/templates/presentation-evidence.md +33 -0
  189. package/skills/sherpa/templates/presentation-plan.md +349 -0
  190. package/skills/sherpa/templates/presentation-qna.md +29 -0
  191. package/skills/sherpa/templates/presentation-risk.md +42 -0
  192. package/skills/sherpa/templates/presentation-verification.md +57 -0
  193. package/skills/sherpa/templates/project-plan.md +242 -0
  194. package/skills/sherpa/templates/project-state.md +84 -0
  195. package/skills/sherpa/templates/red-team-finding.md +73 -0
  196. package/skills/sherpa/templates/red-team-review.md +105 -0
  197. package/skills/sherpa/templates/red-team-scenario.md +43 -0
  198. package/skills/sherpa/templates/red-team-verification.md +31 -0
  199. package/skills/sherpa/templates/repo-analysis.md +204 -0
  200. package/skills/sherpa/templates/requirement-audit.md +15 -0
  201. package/skills/sherpa/templates/research-comparison.md +124 -0
  202. package/skills/sherpa/templates/research-plan.md +93 -0
  203. package/skills/sherpa/templates/research-report.md +92 -0
  204. package/skills/sherpa/templates/research-source.md +77 -0
  205. package/skills/sherpa/templates/score-optimization-plan.md +197 -0
  206. package/skills/sherpa/templates/security-finding.md +45 -0
  207. package/skills/sherpa/templates/security-review.md +64 -0
  208. package/skills/sherpa/templates/slide-claim.md +47 -0
  209. package/skills/sherpa/templates/slide-plan.md +127 -0
  210. package/skills/sherpa/templates/submission-artifact.md +15 -0
  211. package/skills/sherpa/templates/submission-checklist.md +24 -0
  212. package/skills/sherpa/templates/submission-field.md +14 -0
  213. package/skills/sherpa/templates/submission-link.md +14 -0
  214. package/skills/sherpa/templates/submission-plan.md +31 -0
  215. package/skills/sherpa/templates/submission-readiness.md +18 -0
  216. package/skills/sherpa/templates/submission-requirement.md +12 -0
  217. package/skills/sherpa/templates/submission-risk.md +14 -0
  218. package/skills/sherpa/templates/submission-snapshot.md +20 -0
  219. package/skills/sherpa/templates/submission-verification.md +12 -0
  220. package/skills/sherpa/templates/test-plan.md +59 -0
  221. package/skills/sherpa/templates/test-result.md +46 -0
  222. package/skills/sherpa/templates/timeline.md +11 -0
  223. package/skills/sherpa/templates/ux-finding.md +56 -0
  224. package/skills/sherpa/templates/ux-flow.md +46 -0
  225. package/skills/sherpa/templates/ux-review.md +113 -0
  226. package/skills/sherpa/templates/ux-verification.md +32 -0
  227. package/skills/sherpa/workflows/configuration.md +23 -0
  228. package/skills/sherpa/workflows/demo-preparation.md +399 -0
  229. package/skills/sherpa/workflows/final-audit.md +713 -0
  230. package/skills/sherpa/workflows/idea-evaluation.md +239 -0
  231. package/skills/sherpa/workflows/idea-intelligence.md +69 -0
  232. package/skills/sherpa/workflows/implementation.md +42 -0
  233. package/skills/sherpa/workflows/init.md +102 -0
  234. package/skills/sherpa/workflows/judge-simulation.md +408 -0
  235. package/skills/sherpa/workflows/lifecycle.md +51 -0
  236. package/skills/sherpa/workflows/next.md +96 -0
  237. package/skills/sherpa/workflows/postmortem.md +76 -0
  238. package/skills/sherpa/workflows/presentation.md +522 -0
  239. package/skills/sherpa/workflows/project-planning.md +327 -0
  240. package/skills/sherpa/workflows/red-team.md +373 -0
  241. package/skills/sherpa/workflows/research.md +142 -0
  242. package/skills/sherpa/workflows/score-optimization.md +276 -0
  243. package/skills/sherpa/workflows/status.md +107 -0
  244. package/skills/sherpa/workflows/submission.md +46 -0
  245. package/skills/sherpa/workflows/testing-security.md +44 -0
  246. package/skills/sherpa/workflows/ux-review.md +59 -0
@@ -0,0 +1,458 @@
1
+ #!/usr/bin/env python3
2
+ """Semantic claim-to-evidence verification system.
3
+
4
+ Verifies whether a given claim is supported by candidate evidence text.
5
+ Uses sentence embeddings for semantic similarity, with explicit compatibility
6
+ gates for numeric, entity, polarity, and temporal consistency.
7
+
8
+ Architecture separates RETRIEVAL (candidate evidence selection) from
9
+ VERIFICATION (support decision). This module implements VERIFICATION only.
10
+
11
+ No LLM or network calls at verification time; the embedding model is loaded
12
+ once at first use. Falls back to character/word overlap if embeddings are
13
+ unavailable.
14
+
15
+ Labels:
16
+ SUPPORTED - evidence materially establishes the claim
17
+ PARTIALLY_SUPPORTED - evidence establishes some but not all of the claim
18
+ UNSUPPORTED - no evidence establishes the claim
19
+ CONTRADICTED - evidence directly conflicts with the claim
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import re
25
+ from dataclasses import dataclass, field
26
+ from typing import Any
27
+
28
+ try:
29
+ from sentence_transformers import SentenceTransformer
30
+ import numpy as np
31
+ _EMBEDDING_AVAILABLE = True
32
+ except ImportError: # pragma: no cover - environment dependent
33
+ _EMBEDDING_AVAILABLE = False
34
+
35
+
36
+ SUPPORTED = "SUPPORTED"
37
+ PARTIALLY_SUPPORTED = "PARTIALLY_SUPPORTED"
38
+ UNSUPPORTED = "UNSUPPORTED"
39
+ CONTRADICTED = "CONTRADICTED"
40
+
41
+ VALID_LABELS = {SUPPORTED, PARTIALLY_SUPPORTED, UNSUPPORTED, CONTRADICTED}
42
+
43
+ # ---------------------------------------------------------------------------
44
+ # Thresholds (calibration-only; NOT tuned against held-out test)
45
+ # These were selected using the calibration split only.
46
+ # ---------------------------------------------------------------------------
47
+ SEMANTIC_SUPPORT_THRESHOLD = 0.72 # semantic similarity >= 0.72 -> support candidate
48
+ SEMANTIC_PARTIAL_THRESHOLD = 0.55 # semantic similarity >= 0.55 -> partial support
49
+ SEMANTIC_NO_EVIDENCE = 0.20 # semantic similarity < 0.20 -> no evidence
50
+
51
+ # Claim coverage thresholds for compound claims (fraction of sub-claims supported)
52
+ COVERAGE_SUPPORT_THRESHOLD = 0.70 # >= 70% sub-claims supported -> SUPPORTED
53
+ COVERAGE_PARTIAL_THRESHOLD = 0.25 # >= 25% sub-claims supported -> PARTIALLY_SUPPORTED
54
+
55
+ # Numerical tolerance for "approximately equal" numeric claims
56
+ NUMERIC_TOLERANCE = 0.05
57
+
58
+ # Negation cue tokens
59
+ NEGATION_CUES = {
60
+ "no", "not", "never", "none", "nobody", "nothing", "neither", "nor",
61
+ "nowhere", "cannot", "can't", "don't", "doesn't", "didn't", "won't",
62
+ "wouldn't", "couldn't", "shouldn't", "isn't", "aren't", "wasn't",
63
+ "weren't", "hasn't", "haven't", "hadn't", "without", "lack",
64
+ }
65
+
66
+ # Lazy-loaded embedding model
67
+ _model: Any = None
68
+
69
+
70
+ # ---------------------------------------------------------------------------
71
+ # Text processing
72
+ # ---------------------------------------------------------------------------
73
+
74
+ def _tokens(text: str) -> set[str]:
75
+ """Return lowercased alphanumeric word tokens."""
76
+ return set(re.findall(r"[a-z0-9]+", text.casefold()))
77
+
78
+
79
+ def _char_ngrams(text: str, n: int = 3) -> set[str]:
80
+ """Return character n-grams of text."""
81
+ text = text.casefold()
82
+ if len(text) < n:
83
+ return {text} if text else set()
84
+ return set(text[i:i + n] for i in range(len(text) - n + 1))
85
+
86
+
87
+ def _jaccard(a: set[str], b: set[str]) -> float:
88
+ if not a or not b:
89
+ return 0.0
90
+ inter = len(a & b)
91
+ union = len(a | b)
92
+ return inter / union if union else 0.0
93
+
94
+
95
+ def _containment(a: set[str], b: set[str]) -> float:
96
+ """Fraction of tokens in `a` that also appear in `b` (asymmetric)."""
97
+ if not a:
98
+ return 0.0
99
+ return len(a & b) / len(a)
100
+
101
+
102
+ # ---------------------------------------------------------------------------
103
+ # Feature extraction
104
+ # ---------------------------------------------------------------------------
105
+
106
+ def _extract_numbers(text: str) -> list[tuple[str, float]]:
107
+ """Extract numeric tokens with their raw string and float value."""
108
+ results: list[tuple[str, float]] = []
109
+ for match in re.finditer(r"\b\d+(?:\.\d+)?\b", text):
110
+ raw = match.group()
111
+ try:
112
+ results.append((raw, float(raw)))
113
+ except ValueError:
114
+ continue
115
+ return results
116
+
117
+
118
+ def _has_negation(text: str) -> bool:
119
+ toks = _tokens(text)
120
+ return bool(toks & NEGATION_CUES)
121
+
122
+
123
+ def _extract_entities(text: str) -> set[str]:
124
+ """Extract potential named entities: capitalized words and all-caps acronyms."""
125
+ toks = re.findall(r"\b[A-Z][a-zA-Z]+\b|\b[A-Z]{2,}\b", text)
126
+ entities = set(t.lower() for t in toks if len(t) > 1)
127
+ # Preserve short identifiers when a generic label makes their role clear.
128
+ labeled = re.findall(
129
+ r"\b(System|Company|Organization|Project|Product|Model|Team|Platform)\s+([A-Z])\b",
130
+ text,
131
+ )
132
+ entities.discard("system")
133
+ entities.update(f"{label.lower()} {suffix.lower()}" for label, suffix in labeled)
134
+ return entities
135
+
136
+
137
+ def _extract_dates(text: str) -> set[str]:
138
+ """Extract date-like patterns (ISO, US, standalone year)."""
139
+ patterns = [
140
+ r"\b\d{4}-\d{2}-\d{2}\b", # YYYY-MM-DD
141
+ r"\b\d{2}-\d{2}-\d{4}\b", # MM-DD-YYYY
142
+ r"\b\d{1,2}/\d{1,2}/\d{2,4}\b", # M/D/YY or M/D/YYYY
143
+ r"\b\d{4}\b", # standalone year
144
+ ]
145
+ dates: set[str] = set()
146
+ for pat in patterns:
147
+ for match in re.finditer(pat, text):
148
+ dates.add(match.group())
149
+ return dates
150
+
151
+
152
+ # ---------------------------------------------------------------------------
153
+ # Compatibility gates
154
+ # ---------------------------------------------------------------------------
155
+
156
+ def _numeric_claim_conflict(claim_text: str, evidence_text: str) -> bool:
157
+ """Return True if numbers in claim directly conflict with numbers in evidence."""
158
+ claim_nums = _extract_numbers(claim_text)
159
+ ev_nums = _extract_numbers(evidence_text)
160
+ if not claim_nums or not ev_nums:
161
+ return False
162
+ for _raw_c, val_c in claim_nums:
163
+ for _raw_e, val_e in ev_nums:
164
+ if abs(val_c - val_e) > NUMERIC_TOLERANCE * max(abs(val_c), abs(val_e), 1.0):
165
+ if 0.1 <= val_c / max(val_e, 0.001) <= 10.0:
166
+ return True
167
+ return False
168
+
169
+
170
+ def _entity_mismatch(claim_text: str, evidence_text: str) -> bool:
171
+ """Return True if claim and evidence mention different entities.
172
+
173
+ Only fires when BOTH texts contain entities and they are disjoint
174
+ AND semantic similarity is high (suggesting same topic, different subject).
175
+ Used as a compatibility signal, not a hard contradiction gate.
176
+ """
177
+ subject_pattern = r"\b(?:System|Company|Organization|Project|Product|Model|Team|Platform)\s+[A-Z]\b"
178
+ claim_subjects = {value.casefold() for value in re.findall(subject_pattern, claim_text)}
179
+ evidence_subjects = {value.casefold() for value in re.findall(subject_pattern, evidence_text)}
180
+ if claim_subjects and evidence_subjects:
181
+ return not claim_subjects & evidence_subjects
182
+ claim_ents = _extract_entities(claim_text)
183
+ ev_ents = _extract_entities(evidence_text)
184
+ if not claim_ents or not ev_ents:
185
+ return False
186
+ return not claim_ents & ev_ents
187
+
188
+
189
+ def _temporal_mismatch(claim_text: str, evidence_text: str) -> bool:
190
+ """Return True if dates in claim conflict with dates in evidence.
191
+
192
+ Only fires when BOTH texts contain dates and they disagree.
193
+ Absence of dates in evidence does NOT trigger this gate.
194
+ """
195
+ claim_dates = _extract_dates(claim_text)
196
+ ev_dates = _extract_dates(evidence_text)
197
+ if not claim_dates or not ev_dates:
198
+ return False
199
+ return not claim_dates & ev_dates
200
+
201
+
202
+ def _polarity_mismatch(claim_text: str, evidence_text: str, similarity: float) -> bool:
203
+ """Return True if claim and evidence have opposite polarity with similarity."""
204
+ claim_words = _tokens(claim_text)
205
+ evidence_words = _tokens(evidence_text)
206
+ positive = {"enabled", "active", "true", "available"}
207
+ negative = {"disabled", "inactive", "false", "unavailable"}
208
+ claim_positive = bool(claim_words & positive)
209
+ claim_negative = bool(claim_words & negative)
210
+ evidence_positive = bool(evidence_words & positive)
211
+ evidence_negative = bool(evidence_words & negative)
212
+ if similarity > 0.20 and ((claim_positive and evidence_negative) or (claim_negative and evidence_positive)):
213
+ return True
214
+ claim_neg = _has_negation(claim_text)
215
+ ev_neg = _has_negation(evidence_text)
216
+ return claim_neg != ev_neg and similarity > 0.20
217
+
218
+
219
+ # ---------------------------------------------------------------------------
220
+ # Embedding model
221
+ # ---------------------------------------------------------------------------
222
+
223
+ def _get_model() -> Any:
224
+ """Lazy-load the sentence embedding model."""
225
+ global _model
226
+ if _model is not None:
227
+ return _model
228
+ if not _EMBEDDING_AVAILABLE:
229
+ return None
230
+ try:
231
+ _model = SentenceTransformer("all-MiniLM-L6-v2")
232
+ return _model
233
+ except Exception:
234
+ _model = None
235
+ return None
236
+
237
+
238
+ def _semantic_similarity(claim_text: str, evidence_text: str) -> float:
239
+ """Calculate semantic similarity between claim and evidence.
240
+
241
+ Uses sentence-transformers cosine similarity when available; falls back
242
+ to the max of character n-gram and word Jaccard otherwise.
243
+ """
244
+ model = _get_model()
245
+ if model is not None:
246
+ try:
247
+ emb1 = model.encode([claim_text], convert_to_numpy=True)[0]
248
+ emb2 = model.encode([evidence_text], convert_to_numpy=True)[0]
249
+ denom = float(np.linalg.norm(emb1) * np.linalg.norm(emb2))
250
+ if denom == 0.0:
251
+ return 0.0
252
+ return float(np.dot(emb1, emb2) / denom)
253
+ except Exception:
254
+ pass
255
+ # Fallback: character n-gram + word overlap
256
+ char_sim = _jaccard(_char_ngrams(claim_text), _char_ngrams(evidence_text))
257
+ word_sim = _jaccard(_tokens(claim_text), _tokens(evidence_text))
258
+ return max(char_sim, word_sim)
259
+
260
+
261
+ # ---------------------------------------------------------------------------
262
+ # Compound claim handling
263
+ # ---------------------------------------------------------------------------
264
+
265
+ def _split_compound_claim(claim_text: str) -> list[str]:
266
+ """Split a compound claim into sub-claims on 'and' boundaries."""
267
+ parts = re.split(r"\s+and\s+", claim_text, flags=re.IGNORECASE)
268
+ return [p.strip() for p in parts if p.strip()]
269
+
270
+
271
+ def _sub_claim_supported(sub_claim: str, evidence_text: str) -> bool:
272
+ """Check whether a single sub-claim is supported by evidence."""
273
+ sub_sim = _semantic_similarity(sub_claim, evidence_text)
274
+ if _numeric_claim_conflict(sub_claim, evidence_text):
275
+ return False
276
+ if _polarity_mismatch(sub_claim, evidence_text, sub_sim):
277
+ return False
278
+ if sub_sim >= SEMANTIC_SUPPORT_THRESHOLD:
279
+ return True
280
+ # Short factual clauses can score poorly against a longer evidence block.
281
+ # Require all meaningful claim tokens to occur in the evidence before using
282
+ # this bounded lexical support fallback.
283
+ ignored = {"a", "an", "the", "is", "are", "was", "were", "be", "been", "being",
284
+ "use", "uses", "used", "has", "have", "had", "and", "or", "to", "of",
285
+ "in", "on", "for", "with", "requires", "require", "does", "do"}
286
+ anchors = _tokens(sub_claim) - ignored
287
+ return bool(anchors) and anchors <= _tokens(evidence_text)
288
+
289
+
290
+ # ---------------------------------------------------------------------------
291
+ # Verification decision
292
+ # ---------------------------------------------------------------------------
293
+
294
+ @dataclass
295
+ class VerificationResult:
296
+ label: str
297
+ confidence: float
298
+ semantic_similarity: float
299
+ coverage: float
300
+ details: dict[str, Any]
301
+
302
+
303
+ def verify_claim(claim_text: str, evidence_text: str) -> VerificationResult:
304
+ """Verify a single claim against a single evidence text.
305
+
306
+ Decision pipeline:
307
+ 1. Compute semantic similarity (embedding or fallback).
308
+ 2. Check compatibility gates (numeric, entity, polarity, temporal).
309
+ 3. If any gate fires → CONTRADICTED (confidence = 0).
310
+ 4. If strong semantic match and full coverage → SUPPORTED.
311
+ 5. If partial match → PARTIALLY_SUPPORTED.
312
+ 6. Otherwise → UNSUPPORTED (confidence = 0).
313
+
314
+ Confidence semantics (per benchmark rules):
315
+ SUPPORTED → confidence > 0 (strength of support)
316
+ PARTIAL_SUPPORT → confidence reflects partial support strength
317
+ UNSUPPORTED → confidence = 0
318
+ CONTRADICTED → confidence = 0
319
+ """
320
+ claim_text = claim_text or ""
321
+ evidence_text = evidence_text or ""
322
+
323
+ # Step 1: semantic similarity
324
+ semantic_sim = _semantic_similarity(claim_text, evidence_text)
325
+
326
+ # Step 2: claim coverage (compound claims split on "and")
327
+ sub_claims = _split_compound_claim(claim_text)
328
+ if len(sub_claims) > 1:
329
+ supported_count = sum(
330
+ 1 for sub in sub_claims if _sub_claim_supported(sub, evidence_text)
331
+ )
332
+ coverage = supported_count / len(sub_claims)
333
+ else:
334
+ coverage = 1.0 if semantic_sim >= SEMANTIC_SUPPORT_THRESHOLD else 0.0
335
+
336
+ # Step 3: compatibility gates (hard contradiction gates only)
337
+ # Entity mismatch is recorded as a detail but does NOT force CONTRADICTED;
338
+ # semantic similarity is the primary determinant of support.
339
+ numeric_conflict = _numeric_claim_conflict(claim_text, evidence_text)
340
+ temporal_conflict = _temporal_mismatch(claim_text, evidence_text)
341
+ polarity_mismatch = _polarity_mismatch(claim_text, evidence_text, semantic_sim)
342
+ entity_mismatch = _entity_mismatch(claim_text, evidence_text)
343
+
344
+ contradiction = numeric_conflict or temporal_conflict or polarity_mismatch
345
+
346
+ details: dict[str, Any] = {
347
+ "claim_token_count": len(_tokens(claim_text)),
348
+ "evidence_token_count": len(_tokens(evidence_text)),
349
+ "semantic_similarity": round(semantic_sim, 4),
350
+ "coverage": round(coverage, 4),
351
+ "numeric_conflict": numeric_conflict,
352
+ "entity_mismatch": entity_mismatch,
353
+ "temporal_conflict": temporal_conflict,
354
+ "polarity_mismatch": polarity_mismatch,
355
+ "contradiction": contradiction,
356
+ "sub_claims": sub_claims,
357
+ "embedding_available": _EMBEDDING_AVAILABLE and _get_model() is not None,
358
+ }
359
+
360
+ # Step 4: decision
361
+ # Strong-match bypass: if full-claim semantic similarity is very high,
362
+ # trust it even when sub-claim coverage is imperfect (sub-claim splitting
363
+ # can be unreliable for short or context-dependent sub-claims).
364
+ if contradiction:
365
+ label = CONTRADICTED
366
+ confidence = 0.0
367
+ elif entity_mismatch:
368
+ # A related statement about a different identified subject is not
369
+ # evidence for this claim, but does not itself disprove the claim.
370
+ label = UNSUPPORTED
371
+ confidence = 0.0
372
+ elif semantic_sim >= 0.85:
373
+ label = SUPPORTED
374
+ confidence = round(0.75 + 0.20 * semantic_sim, 4)
375
+ confidence = min(confidence, 0.95)
376
+ elif semantic_sim >= SEMANTIC_SUPPORT_THRESHOLD and coverage >= COVERAGE_SUPPORT_THRESHOLD:
377
+ label = SUPPORTED
378
+ confidence = round(0.70 + 0.25 * semantic_sim * coverage, 4)
379
+ confidence = min(confidence, 0.95)
380
+ elif semantic_sim >= SEMANTIC_PARTIAL_THRESHOLD or coverage >= COVERAGE_PARTIAL_THRESHOLD:
381
+ label = PARTIALLY_SUPPORTED
382
+ confidence = round(0.50 + 0.20 * semantic_sim * coverage, 4)
383
+ confidence = min(confidence, 0.85)
384
+ else:
385
+ label = UNSUPPORTED
386
+ confidence = 0.0
387
+
388
+ return VerificationResult(
389
+ label=label,
390
+ confidence=confidence,
391
+ semantic_similarity=round(semantic_sim, 4),
392
+ coverage=round(coverage, 4),
393
+ details=details,
394
+ )
395
+
396
+
397
+ def verify_claims(claims: list[dict[str, str]]) -> list[dict[str, Any]]:
398
+ """Verify multiple claims. Each claim dict needs 'claim_text' and 'evidence_text'."""
399
+ results: list[dict[str, Any]] = []
400
+ for item in claims:
401
+ result = verify_claim(item.get("claim_text", ""), item.get("evidence_text", ""))
402
+ results.append({
403
+ "claim_id": item.get("claim_id", "UNKNOWN"),
404
+ "predicted_label": result.label,
405
+ "confidence": result.confidence,
406
+ "semantic_similarity": result.semantic_similarity,
407
+ "coverage": result.coverage,
408
+ "details": result.details,
409
+ })
410
+ return results
411
+
412
+
413
+ # ---------------------------------------------------------------------------
414
+ # CLI
415
+ # ---------------------------------------------------------------------------
416
+
417
+ def main() -> int:
418
+ import argparse
419
+ import json
420
+ import sys
421
+
422
+ parser = argparse.ArgumentParser(description="Verify claims against evidence")
423
+ parser.add_argument("--claim", help="claim text")
424
+ parser.add_argument("--evidence", help="evidence text")
425
+ parser.add_argument("--input", help="JSON file with list of claim objects")
426
+ parser.add_argument("--output", help="output JSON file")
427
+ args = parser.parse_args()
428
+
429
+ if args.input:
430
+ with open(args.input, encoding="utf-8") as f:
431
+ data = json.load(f)
432
+ claims = data if isinstance(data, list) else [data]
433
+ results = verify_claims(claims)
434
+ output = {"results": results}
435
+ elif args.claim:
436
+ result = verify_claim(args.claim, args.evidence or "")
437
+ output = {
438
+ "label": result.label,
439
+ "confidence": result.confidence,
440
+ "semantic_similarity": result.semantic_similarity,
441
+ "coverage": result.coverage,
442
+ "details": result.details,
443
+ }
444
+ else:
445
+ parser.print_help()
446
+ return 2
447
+
448
+ text = json.dumps(output, ensure_ascii=False, indent=2)
449
+ if args.output:
450
+ with open(args.output, "w", encoding="utf-8") as f:
451
+ f.write(text + "\n")
452
+ else:
453
+ print(text)
454
+ return 0
455
+
456
+
457
+ if __name__ == "__main__":
458
+ raise SystemExit(main())
@@ -0,0 +1,20 @@
1
+ # Final Audit Finding
2
+
3
+ **Finding ID:** <unique ID>
4
+ **Domain:** <A through R>
5
+ **Severity:** CRITICAL / HIGH / MEDIUM / LOW / UNKNOWN
6
+ **Confidence:** HIGH / MEDIUM / LOW / UNKNOWN
7
+ **Description:** <finding description>
8
+ **Evidence:** <evidence supporting finding>
9
+ **Evidence Status:** FACT / INFERENCE / ASSUMPTION / UNKNOWN
10
+ **Impact:** <impact description>
11
+ **Recommendation:** <recommended remediation>
12
+ **Owner Phase:** <owning phase or UNKNOWN>
13
+ **Human Approval Required:** YES / NO
14
+ **Status:** OPEN | IN_PROGRESS | VERIFIED_MITIGATED | ACCEPTED_RISK | BLOCKED | UNKNOWN | NOT_APPLICABLE
15
+ **Verification:** <verification evidence>
16
+ **Final Disposition:** <final disposition>
17
+
18
+ ---
19
+
20
+ **Rule:** Never mark unresolved CRITICAL finding as resolved without verification.
@@ -0,0 +1,15 @@
1
+ # Claim Audit
2
+
3
+ **Claim ID:** <unique ID>
4
+ **Claim:** <claim text>
5
+ **Source:** <claim source>
6
+ **Evidence:** <evidence supporting claim>
7
+ **Evidence Status:** FACT / INFERENCE / ASSUMPTION / UNKNOWN
8
+ **Confidence:** HIGH / MEDIUM / LOW / UNKNOWN
9
+ **Credibility Status:** VERIFIED / SUPPORTED / PARTIALLY_SUPPORTED / UNSUPPORTED / CONTRADICTED / UNKNOWN
10
+ **Risk:** <risk description>
11
+ **Action:** REMOVE / WEAKEN / QUALIFY / KEEP
12
+
13
+ ---
14
+
15
+ **Rule:** CONTRADICTED claims must be corrected or removed. UNSUPPORTED claims must be removed, weakened, or explicitly qualified. UNKNOWN claims must remain UNKNOWN.
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "UNKNOWN",
3
+ "url": "UNKNOWN",
4
+ "platform": "UNKNOWN",
5
+ "edition": "UNKNOWN",
6
+ "deadline": {
7
+ "datetime": "UNKNOWN",
8
+ "timezone": "UNKNOWN",
9
+ "source": "UNKNOWN",
10
+ "confidence": "UNKNOWN"
11
+ },
12
+ "tracks": "UNKNOWN",
13
+ "judging_criteria": "UNKNOWN",
14
+ "official_requirements": "UNKNOWN",
15
+ "project": {
16
+ "name": "UNKNOWN",
17
+ "path": "UNKNOWN",
18
+ "repository": "UNKNOWN",
19
+ "deployment": "UNKNOWN"
20
+ }
21
+ }
@@ -0,0 +1,3 @@
1
+ # Optional integration metadata and credentials
2
+ GITHUB_REPOSITORY=
3
+ GITHUB_TOKEN=
@@ -0,0 +1,12 @@
1
+ # Project environment variables
2
+ # Empty values stay UNKNOWN. Keep secret values in the ignored project-root .env.
3
+ HACKATHON_NAME=
4
+ HACKATHON_URL=
5
+ HACKATHON_PLATFORM=
6
+ HACKATHON_EDITION=
7
+ HACKATHON_DEADLINE=
8
+ HACKATHON_TIMEZONE=
9
+ PROJECT_NAME=
10
+ PROJECT_PATH=
11
+ GITHUB_REPOSITORY=
12
+ DEPLOYMENT_URL=
@@ -0,0 +1,4 @@
1
+ # AI provider metadata and secret reference
2
+ AI_PROVIDER=
3
+ AI_MODEL=
4
+ AI_API_KEY=
@@ -0,0 +1,22 @@
1
+ {
2
+ "agent_platform": "UNKNOWN",
3
+ "ai_provider": "UNKNOWN",
4
+ "ai_model": "UNKNOWN",
5
+ "verification": {
6
+ "enabled": true
7
+ },
8
+ "red_team": {
9
+ "enabled": true
10
+ },
11
+ "research": {
12
+ "enabled": true
13
+ },
14
+ "video": {
15
+ "enabled": true
16
+ },
17
+ "autonomous_loop": {
18
+ "max_iterations": 5,
19
+ "max_auto_fixes": 10,
20
+ "require_human_approval": true
21
+ }
22
+ }
@@ -0,0 +1,17 @@
1
+ # Consistency Audit
2
+
3
+ **Consistency ID:** <unique ID>
4
+ **Source Artifact 1:** <first artifact>
5
+ **Source Artifact 2:** <second artifact>
6
+ **Claim 1:** <claim from artifact 1>
7
+ **Claim 2:** <claim from artifact 2>
8
+ **Contradiction:** <description of contradiction>
9
+ **Evidence:** <evidence supporting contradiction>
10
+ **Evidence Status:** FACT / INFERENCE / ASSUMPTION / UNKNOWN
11
+ **Confidence:** HIGH / MEDIUM / LOW / UNKNOWN
12
+ **Action:** <resolution action>
13
+ **Status:** OPEN / IN_PROGRESS / RESOLVED / BLOCKED / UNKNOWN
14
+
15
+ ---
16
+
17
+ **Rule:** Every contradiction becomes an explicit finding.
@@ -0,0 +1,18 @@
1
+ # Decision Retrospective Record
2
+
3
+ - Decision ID: UNKNOWN
4
+ - Date / time: UNKNOWN
5
+ - Decision: UNKNOWN
6
+ - Context: UNKNOWN
7
+ - Available evidence at decision time: UNKNOWN
8
+ - Options considered: UNKNOWN
9
+ - Chosen option: UNKNOWN
10
+ - Reason: UNKNOWN
11
+ - Human decision maker / approval: UNKNOWN
12
+ - Expected outcome: UNKNOWN
13
+ - Actual outcome: UNKNOWN
14
+ - Decision quality: EXCELLENT / GOOD / ACCEPTABLE / WEAK / POOR / UNKNOWN
15
+ - Evidence: UNKNOWN
16
+ - Lesson: UNKNOWN
17
+
18
+ Evaluate reasonableness using contemporaneous information, not outcome alone. Never attribute a human decision to AI.
@@ -0,0 +1,42 @@
1
+ # Demo Checkpoint
2
+
3
+ **Checkpoint ID:** <unique ID>
4
+ **Condition:** <what must be true>
5
+
6
+ ---
7
+
8
+ ## Verification
9
+
10
+ | Verification Method | Expected Result | Actual Result | Status |
11
+ |---------------------|-----------------|---------------|--------|
12
+ | | | | PLANNED / EXECUTED / PASSED / FAILED / BLOCKED / UNKNOWN |
13
+
14
+ ---
15
+
16
+ ## Evidence
17
+
18
+ | Evidence Item | Type | Source | Status |
19
+ |-----------------|------|--------|--------|
20
+ | | UI / output / test / log / artifact / live behavior / documentation | | FACT / INFERENCE / ASSUMPTION / UNKNOWN |
21
+
22
+ ---
23
+
24
+ ## Owner
25
+
26
+ <owner name or UNKNOWN>
27
+
28
+ ---
29
+
30
+ ## Recovery Action
31
+
32
+ <recovery action if checkpoint fails>
33
+
34
+ ---
35
+
36
+ ## Related Demo Step
37
+
38
+ <step ID or UNKNOWN>
39
+
40
+ ---
41
+
42
+ **Rule:** A checkpoint marked PASSED must have actual evidence.
@@ -0,0 +1,32 @@
1
+ # Demo Evidence
2
+
3
+ **Claim ID:** <unique ID>
4
+ **Claim:** <what is being demonstrated>
5
+
6
+ ---
7
+
8
+ ## Evidence
9
+
10
+ | Evidence Item | Evidence Type | Source | Evidence Status | Confidence | Demo Step |
11
+ |---------------|---------------|--------|-----------------|--------------|-----------|
12
+ | | UI / output / test / log / artifact / live behavior / documentation | | FACT / INFERENCE / ASSUMPTION / UNKNOWN | HIGH / MEDIUM / LOW / UNKNOWN | |
13
+
14
+ ---
15
+
16
+ ## Verification
17
+
18
+ | Verification Method | Result | Status |
19
+ |---------------------|--------|--------|
20
+ | | | PLANNED / EXECUTED / PASSED / FAILED / BLOCKED / UNKNOWN / NOT_APPLICABLE |
21
+
22
+ ---
23
+
24
+ ## Judge-Visible Moment
25
+
26
+ | Moment ID | What Judge Should Notice | How Demonstrated | Expected Takeaway |
27
+ |-----------|-------------------------|------------------|-------------------|
28
+ | | | | |
29
+
30
+ ---
31
+
32
+ **Rule:** No evidence → UNKNOWN. Weak evidence cannot be upgraded merely because the feature exists. Generated documentation is not proof of runtime behavior.