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.
- package/.agents/plugins/marketplace.json +11 -0
- package/.agents/skills/sherpa/SKILL.md +161 -0
- package/.agents/skills/sherpa/commands/README.md +43 -0
- package/.agents/skills/sherpa/commands/manifest.json +589 -0
- package/.agents/skills/sherpa/commands/sherpa-research.md +147 -0
- package/.agents/skills/sherpa/core/commands/router.py +171 -0
- package/.agents/skills/sherpa/core/configuration/manager.py +504 -0
- package/.agents/skills/sherpa/core/ideas/engine.py +564 -0
- package/.agents/skills/sherpa/docs/commands/README.md +96 -0
- package/.agents/skills/sherpa/docs/configuration/runtime-verification.md +64 -0
- package/.agents/skills/sherpa/rules/demo-preparation-rules.md +543 -0
- package/.agents/skills/sherpa/rules/engineering-rules.md +221 -0
- package/.agents/skills/sherpa/rules/final-audit-rules.md +824 -0
- package/.agents/skills/sherpa/rules/implementation-rules.md +127 -0
- package/.agents/skills/sherpa/rules/judge-rules.md +443 -0
- package/.agents/skills/sherpa/rules/mentor-rules.md +109 -0
- package/.agents/skills/sherpa/rules/postmortem-rules.md +69 -0
- package/.agents/skills/sherpa/rules/presentation-rules.md +783 -0
- package/.agents/skills/sherpa/rules/red-team-rules.md +185 -0
- package/.agents/skills/sherpa/rules/research-rules.md +184 -0
- package/.agents/skills/sherpa/rules/score-optimization-rules.md +355 -0
- package/.agents/skills/sherpa/rules/scoring-rules.md +216 -0
- package/.agents/skills/sherpa/rules/submission-rules.md +41 -0
- package/.agents/skills/sherpa/rules/testing-security-rules.md +87 -0
- package/.agents/skills/sherpa/rules/ux-rules.md +89 -0
- package/.agents/skills/sherpa/src/config_manager.py +474 -0
- package/.agents/skills/sherpa/src/verification.py +458 -0
- package/.agents/skills/sherpa/templates/audit-finding.md +20 -0
- package/.agents/skills/sherpa/templates/claim-audit.md +15 -0
- package/.agents/skills/sherpa/templates/configuration/hackathon.json +21 -0
- package/.agents/skills/sherpa/templates/configuration/integrations.env.example +3 -0
- package/.agents/skills/sherpa/templates/configuration/project.env.example +12 -0
- package/.agents/skills/sherpa/templates/configuration/providers.env.example +4 -0
- package/.agents/skills/sherpa/templates/configuration/settings.json +22 -0
- package/.agents/skills/sherpa/templates/consistency-audit.md +17 -0
- package/.agents/skills/sherpa/templates/decision-log.md +18 -0
- package/.agents/skills/sherpa/templates/demo-checkpoint.md +42 -0
- package/.agents/skills/sherpa/templates/demo-evidence.md +32 -0
- package/.agents/skills/sherpa/templates/demo-finding.md +112 -0
- package/.agents/skills/sherpa/templates/demo-flow.md +52 -0
- package/.agents/skills/sherpa/templates/demo-plan.md +265 -0
- package/.agents/skills/sherpa/templates/demo-verification.md +57 -0
- package/.agents/skills/sherpa/templates/final-audit.md +387 -0
- package/.agents/skills/sherpa/templates/final-risk.md +17 -0
- package/.agents/skills/sherpa/templates/final-verification.md +57 -0
- package/.agents/skills/sherpa/templates/gap-analysis.md +113 -0
- package/.agents/skills/sherpa/templates/idea-comparison.md +129 -0
- package/.agents/skills/sherpa/templates/idea-evaluation.md +251 -0
- package/.agents/skills/sherpa/templates/implementation-plan.md +96 -0
- package/.agents/skills/sherpa/templates/implementation-task.md +57 -0
- package/.agents/skills/sherpa/templates/improvement-candidate.md +135 -0
- package/.agents/skills/sherpa/templates/improvement.md +18 -0
- package/.agents/skills/sherpa/templates/incident.md +20 -0
- package/.agents/skills/sherpa/templates/judge-criterion.md +41 -0
- package/.agents/skills/sherpa/templates/judge-question.md +41 -0
- package/.agents/skills/sherpa/templates/judge-session.md +125 -0
- package/.agents/skills/sherpa/templates/judge-simulation.md +264 -0
- package/.agents/skills/sherpa/templates/lesson.md +14 -0
- package/.agents/skills/sherpa/templates/postmortem.md +87 -0
- package/.agents/skills/sherpa/templates/presentation-evidence.md +33 -0
- package/.agents/skills/sherpa/templates/presentation-plan.md +349 -0
- package/.agents/skills/sherpa/templates/presentation-qna.md +29 -0
- package/.agents/skills/sherpa/templates/presentation-risk.md +42 -0
- package/.agents/skills/sherpa/templates/presentation-verification.md +57 -0
- package/.agents/skills/sherpa/templates/project-plan.md +242 -0
- package/.agents/skills/sherpa/templates/project-state.md +84 -0
- package/.agents/skills/sherpa/templates/red-team-finding.md +73 -0
- package/.agents/skills/sherpa/templates/red-team-review.md +105 -0
- package/.agents/skills/sherpa/templates/red-team-scenario.md +43 -0
- package/.agents/skills/sherpa/templates/red-team-verification.md +31 -0
- package/.agents/skills/sherpa/templates/repo-analysis.md +204 -0
- package/.agents/skills/sherpa/templates/requirement-audit.md +15 -0
- package/.agents/skills/sherpa/templates/research-comparison.md +124 -0
- package/.agents/skills/sherpa/templates/research-plan.md +93 -0
- package/.agents/skills/sherpa/templates/research-report.md +92 -0
- package/.agents/skills/sherpa/templates/research-source.md +77 -0
- package/.agents/skills/sherpa/templates/score-optimization-plan.md +197 -0
- package/.agents/skills/sherpa/templates/security-finding.md +45 -0
- package/.agents/skills/sherpa/templates/security-review.md +64 -0
- package/.agents/skills/sherpa/templates/slide-claim.md +47 -0
- package/.agents/skills/sherpa/templates/slide-plan.md +127 -0
- package/.agents/skills/sherpa/templates/submission-artifact.md +15 -0
- package/.agents/skills/sherpa/templates/submission-checklist.md +24 -0
- package/.agents/skills/sherpa/templates/submission-field.md +14 -0
- package/.agents/skills/sherpa/templates/submission-link.md +14 -0
- package/.agents/skills/sherpa/templates/submission-plan.md +31 -0
- package/.agents/skills/sherpa/templates/submission-readiness.md +18 -0
- package/.agents/skills/sherpa/templates/submission-requirement.md +12 -0
- package/.agents/skills/sherpa/templates/submission-risk.md +14 -0
- package/.agents/skills/sherpa/templates/submission-snapshot.md +20 -0
- package/.agents/skills/sherpa/templates/submission-verification.md +12 -0
- package/.agents/skills/sherpa/templates/test-plan.md +59 -0
- package/.agents/skills/sherpa/templates/test-result.md +46 -0
- package/.agents/skills/sherpa/templates/timeline.md +11 -0
- package/.agents/skills/sherpa/templates/ux-finding.md +56 -0
- package/.agents/skills/sherpa/templates/ux-flow.md +46 -0
- package/.agents/skills/sherpa/templates/ux-review.md +113 -0
- package/.agents/skills/sherpa/templates/ux-verification.md +32 -0
- package/.agents/skills/sherpa/workflows/configuration.md +23 -0
- package/.agents/skills/sherpa/workflows/demo-preparation.md +399 -0
- package/.agents/skills/sherpa/workflows/final-audit.md +713 -0
- package/.agents/skills/sherpa/workflows/idea-evaluation.md +239 -0
- package/.agents/skills/sherpa/workflows/idea-intelligence.md +69 -0
- package/.agents/skills/sherpa/workflows/implementation.md +42 -0
- package/.agents/skills/sherpa/workflows/init.md +102 -0
- package/.agents/skills/sherpa/workflows/judge-simulation.md +408 -0
- package/.agents/skills/sherpa/workflows/lifecycle.md +51 -0
- package/.agents/skills/sherpa/workflows/next.md +96 -0
- package/.agents/skills/sherpa/workflows/postmortem.md +76 -0
- package/.agents/skills/sherpa/workflows/presentation.md +522 -0
- package/.agents/skills/sherpa/workflows/project-planning.md +327 -0
- package/.agents/skills/sherpa/workflows/red-team.md +373 -0
- package/.agents/skills/sherpa/workflows/research.md +142 -0
- package/.agents/skills/sherpa/workflows/score-optimization.md +276 -0
- package/.agents/skills/sherpa/workflows/status.md +107 -0
- package/.agents/skills/sherpa/workflows/submission.md +46 -0
- package/.agents/skills/sherpa/workflows/testing-security.md +44 -0
- package/.agents/skills/sherpa/workflows/ux-review.md +59 -0
- package/.claude-plugin/marketplace.json +21 -0
- package/.claude-plugin/plugin.json +13 -0
- package/.codex-plugin/plugin.json +13 -0
- package/GEMINI.md +3 -0
- package/README.md +11 -7
- package/SKILL.md +161 -0
- package/distribution/cli/sherpa +1 -1
- package/gemini-extension.json +7 -0
- package/package.json +31 -3
- package/plugin.json +20 -0
- package/qwen-extension.json +6 -0
- package/skills/sherpa/SKILL.md +161 -0
- package/skills/sherpa/commands/README.md +43 -0
- package/skills/sherpa/commands/manifest.json +589 -0
- package/skills/sherpa/commands/sherpa-research.md +147 -0
- package/skills/sherpa/core/commands/router.py +171 -0
- package/skills/sherpa/core/configuration/manager.py +504 -0
- package/skills/sherpa/core/ideas/engine.py +564 -0
- package/skills/sherpa/docs/commands/README.md +96 -0
- package/skills/sherpa/docs/configuration/runtime-verification.md +64 -0
- package/skills/sherpa/rules/demo-preparation-rules.md +543 -0
- package/skills/sherpa/rules/engineering-rules.md +221 -0
- package/skills/sherpa/rules/final-audit-rules.md +824 -0
- package/skills/sherpa/rules/implementation-rules.md +127 -0
- package/skills/sherpa/rules/judge-rules.md +443 -0
- package/skills/sherpa/rules/mentor-rules.md +109 -0
- package/skills/sherpa/rules/postmortem-rules.md +69 -0
- package/skills/sherpa/rules/presentation-rules.md +783 -0
- package/skills/sherpa/rules/red-team-rules.md +185 -0
- package/skills/sherpa/rules/research-rules.md +184 -0
- package/skills/sherpa/rules/score-optimization-rules.md +355 -0
- package/skills/sherpa/rules/scoring-rules.md +216 -0
- package/skills/sherpa/rules/submission-rules.md +41 -0
- package/skills/sherpa/rules/testing-security-rules.md +87 -0
- package/skills/sherpa/rules/ux-rules.md +89 -0
- package/skills/sherpa/src/config_manager.py +474 -0
- package/skills/sherpa/src/verification.py +458 -0
- package/skills/sherpa/templates/audit-finding.md +20 -0
- package/skills/sherpa/templates/claim-audit.md +15 -0
- package/skills/sherpa/templates/configuration/hackathon.json +21 -0
- package/skills/sherpa/templates/configuration/integrations.env.example +3 -0
- package/skills/sherpa/templates/configuration/project.env.example +12 -0
- package/skills/sherpa/templates/configuration/providers.env.example +4 -0
- package/skills/sherpa/templates/configuration/settings.json +22 -0
- package/skills/sherpa/templates/consistency-audit.md +17 -0
- package/skills/sherpa/templates/decision-log.md +18 -0
- package/skills/sherpa/templates/demo-checkpoint.md +42 -0
- package/skills/sherpa/templates/demo-evidence.md +32 -0
- package/skills/sherpa/templates/demo-finding.md +112 -0
- package/skills/sherpa/templates/demo-flow.md +52 -0
- package/skills/sherpa/templates/demo-plan.md +265 -0
- package/skills/sherpa/templates/demo-verification.md +57 -0
- package/skills/sherpa/templates/final-audit.md +387 -0
- package/skills/sherpa/templates/final-risk.md +17 -0
- package/skills/sherpa/templates/final-verification.md +57 -0
- package/skills/sherpa/templates/gap-analysis.md +113 -0
- package/skills/sherpa/templates/idea-comparison.md +129 -0
- package/skills/sherpa/templates/idea-evaluation.md +251 -0
- package/skills/sherpa/templates/implementation-plan.md +96 -0
- package/skills/sherpa/templates/implementation-task.md +57 -0
- package/skills/sherpa/templates/improvement-candidate.md +135 -0
- package/skills/sherpa/templates/improvement.md +18 -0
- package/skills/sherpa/templates/incident.md +20 -0
- package/skills/sherpa/templates/judge-criterion.md +41 -0
- package/skills/sherpa/templates/judge-question.md +41 -0
- package/skills/sherpa/templates/judge-session.md +125 -0
- package/skills/sherpa/templates/judge-simulation.md +264 -0
- package/skills/sherpa/templates/lesson.md +14 -0
- package/skills/sherpa/templates/postmortem.md +87 -0
- package/skills/sherpa/templates/presentation-evidence.md +33 -0
- package/skills/sherpa/templates/presentation-plan.md +349 -0
- package/skills/sherpa/templates/presentation-qna.md +29 -0
- package/skills/sherpa/templates/presentation-risk.md +42 -0
- package/skills/sherpa/templates/presentation-verification.md +57 -0
- package/skills/sherpa/templates/project-plan.md +242 -0
- package/skills/sherpa/templates/project-state.md +84 -0
- package/skills/sherpa/templates/red-team-finding.md +73 -0
- package/skills/sherpa/templates/red-team-review.md +105 -0
- package/skills/sherpa/templates/red-team-scenario.md +43 -0
- package/skills/sherpa/templates/red-team-verification.md +31 -0
- package/skills/sherpa/templates/repo-analysis.md +204 -0
- package/skills/sherpa/templates/requirement-audit.md +15 -0
- package/skills/sherpa/templates/research-comparison.md +124 -0
- package/skills/sherpa/templates/research-plan.md +93 -0
- package/skills/sherpa/templates/research-report.md +92 -0
- package/skills/sherpa/templates/research-source.md +77 -0
- package/skills/sherpa/templates/score-optimization-plan.md +197 -0
- package/skills/sherpa/templates/security-finding.md +45 -0
- package/skills/sherpa/templates/security-review.md +64 -0
- package/skills/sherpa/templates/slide-claim.md +47 -0
- package/skills/sherpa/templates/slide-plan.md +127 -0
- package/skills/sherpa/templates/submission-artifact.md +15 -0
- package/skills/sherpa/templates/submission-checklist.md +24 -0
- package/skills/sherpa/templates/submission-field.md +14 -0
- package/skills/sherpa/templates/submission-link.md +14 -0
- package/skills/sherpa/templates/submission-plan.md +31 -0
- package/skills/sherpa/templates/submission-readiness.md +18 -0
- package/skills/sherpa/templates/submission-requirement.md +12 -0
- package/skills/sherpa/templates/submission-risk.md +14 -0
- package/skills/sherpa/templates/submission-snapshot.md +20 -0
- package/skills/sherpa/templates/submission-verification.md +12 -0
- package/skills/sherpa/templates/test-plan.md +59 -0
- package/skills/sherpa/templates/test-result.md +46 -0
- package/skills/sherpa/templates/timeline.md +11 -0
- package/skills/sherpa/templates/ux-finding.md +56 -0
- package/skills/sherpa/templates/ux-flow.md +46 -0
- package/skills/sherpa/templates/ux-review.md +113 -0
- package/skills/sherpa/templates/ux-verification.md +32 -0
- package/skills/sherpa/workflows/configuration.md +23 -0
- package/skills/sherpa/workflows/demo-preparation.md +399 -0
- package/skills/sherpa/workflows/final-audit.md +713 -0
- package/skills/sherpa/workflows/idea-evaluation.md +239 -0
- package/skills/sherpa/workflows/idea-intelligence.md +69 -0
- package/skills/sherpa/workflows/implementation.md +42 -0
- package/skills/sherpa/workflows/init.md +102 -0
- package/skills/sherpa/workflows/judge-simulation.md +408 -0
- package/skills/sherpa/workflows/lifecycle.md +51 -0
- package/skills/sherpa/workflows/next.md +96 -0
- package/skills/sherpa/workflows/postmortem.md +76 -0
- package/skills/sherpa/workflows/presentation.md +522 -0
- package/skills/sherpa/workflows/project-planning.md +327 -0
- package/skills/sherpa/workflows/red-team.md +373 -0
- package/skills/sherpa/workflows/research.md +142 -0
- package/skills/sherpa/workflows/score-optimization.md +276 -0
- package/skills/sherpa/workflows/status.md +107 -0
- package/skills/sherpa/workflows/submission.md +46 -0
- package/skills/sherpa/workflows/testing-security.md +44 -0
- 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,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,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.
|