opencode-wait-a-minute 0.0.0-stage → 1.1.0-rc.10
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/LICENSE +21 -0
- package/README.md +318 -2
- package/index.js +1836 -0
- package/package.json +70 -4
- package/skills/codebase-design/SKILL.md +114 -0
- package/skills/design-contract/SKILL.md +27 -0
- package/skills/design-critique/SKILL.md +19 -0
- package/skills/design-system/SKILL.md +17 -0
- package/skills/design-system/references/image-analysis.md +14 -0
- package/skills/design-system/references/tokens.md +32 -0
- package/skills/design-system/references/ui-rules.md +14 -0
- package/skills/diagnosing-bugs/SKILL.md +138 -0
- package/skills/frontend-design/SKILL.md +36 -0
- package/skills/handoff/SKILL.md +16 -0
- package/skills/improve-codebase-architecture/SKILL.md +71 -0
- package/skills/linter-negative/SKILL.md +74 -0
- package/skills/no-slop-ui/SKILL.md +26 -0
- package/skills/prototype/SKILL.md +26 -0
- package/skills/registry.json +44087 -0
- package/skills/tastemaker/SKILL.md +8 -0
- package/skills/tastemaker/references/tastemaker.md +14 -0
- package/skills/tdd/SKILL.md +38 -0
- package/skills/visual-review/SKILL.md +103 -0
- package/skills/visual-review/references/review-gates.md +42 -0
- package/skills/visual-review/references/surface-archetypes.md +37 -0
- package/skills/wizard/SKILL.md +44 -0
- package/skills/writing-for-agents/SKILL.md +81 -0
- package/src/cognition/cognition-store.js +251 -0
- package/src/cognition/cognitive-state.js +126 -0
- package/src/cognition/hypothesis-manager.js +113 -0
- package/src/cognition/observation-engine.js +112 -0
- package/src/cognition/observation-provenance.js +268 -0
- package/src/context/active-context-boundary.js +68 -0
- package/src/context/assembly.js +494 -0
- package/src/context/assessment-rules.js +55 -0
- package/src/context/capsule-staleness.js +267 -0
- package/src/context/capsules.js +2 -0
- package/src/context/compare-array.js +98 -0
- package/src/context/compare-object.js +89 -0
- package/src/context/compare-values.js +42 -0
- package/src/context/context-assembly-contract.js +71 -0
- package/src/context/context-budget-manager.js +232 -0
- package/src/context/context-builder.js +49 -0
- package/src/context/context-cache.js +55 -0
- package/src/context/context-capture.js +243 -0
- package/src/context/context-classification.js +199 -0
- package/src/context/context-compaction.js +179 -0
- package/src/context/context-decision-audit.js +267 -0
- package/src/context/context-demotion.js +173 -0
- package/src/context/context-dictionary.js +106 -0
- package/src/context/context-drift-detection.js +225 -0
- package/src/context/context-evaluation.js +374 -0
- package/src/context/context-event-ingress.js +100 -0
- package/src/context/context-event-normalization.js +224 -0
- package/src/context/context-feedback-loop.js +216 -0
- package/src/context/context-freshness.js +21 -0
- package/src/context/context-graph-builder.js +71 -0
- package/src/context/context-graph.js +451 -0
- package/src/context/context-history-relevance.js +321 -0
- package/src/context/context-interception.js +145 -0
- package/src/context/context-invalidation-events.js +154 -0
- package/src/context/context-lifecycle.js +170 -0
- package/src/context/context-loop-prevention.js +347 -0
- package/src/context/context-manager.js +340 -0
- package/src/context/context-memory-layers.js +265 -0
- package/src/context/context-minimality.js +166 -0
- package/src/context/context-normalization.js +130 -0
- package/src/context/context-optimization-metrics.js +434 -0
- package/src/context/context-output-policy.js +135 -0
- package/src/context/context-pack-authority.js +157 -0
- package/src/context/context-promotion.js +172 -0
- package/src/context/context-query-contract.js +101 -0
- package/src/context/context-ranking.js +164 -0
- package/src/context/context-rate-distortion.js +261 -0
- package/src/context/context-recovery.js +209 -0
- package/src/context/context-retrieval-integration.js +60 -0
- package/src/context/context-retrieval.js +93 -0
- package/src/context/context-router.js +457 -0
- package/src/context/context-routing-evaluation.js +331 -0
- package/src/context/context-routing-observability.js +296 -0
- package/src/context/context-routing-shadow.js +237 -0
- package/src/context/context-scope.js +181 -0
- package/src/context/context-snapshot.js +226 -0
- package/src/context/context-source-registry.js +95 -0
- package/src/context/context-sufficiency-gate.js +120 -0
- package/src/context/context-sufficiency-oracle.js +167 -0
- package/src/context/context-telemetry.js +176 -0
- package/src/context/context.js +633 -0
- package/src/context/dependency-closure.js +246 -0
- package/src/context/page-fault-tracker.js +275 -0
- package/src/context/prompt-engine.js +74 -0
- package/src/context/runtime-context-graph.js +260 -0
- package/src/context/selection.js +2 -0
- package/src/context/session.js +2 -0
- package/src/context/sufficiency-contract.js +300 -0
- package/src/context/tokenizer.js +17 -0
- package/src/context-benchmark-router.mjs +125 -0
- package/src/evidence/evidence-engine.js +161 -0
- package/src/evidence/evidence-factory.js +3 -0
- package/src/evidence/evidence-freshness.js +463 -0
- package/src/evidence/evidence-gap.js +76 -0
- package/src/evidence/evidence-lineage.js +525 -0
- package/src/evidence/evidence.js +136 -0
- package/src/evidence/freshness-validation.js +187 -0
- package/src/evidence/lineage.js +4 -0
- package/src/execution/action-evaluation.js +179 -0
- package/src/execution/circuit-breaker.js +70 -0
- package/src/execution/claim-interception.js +63 -0
- package/src/execution/execution-engine.js +258 -0
- package/src/execution/execution-intent.js +69 -0
- package/src/execution/execution-state.js +89 -0
- package/src/execution/formatting.js +60 -0
- package/src/execution/l1-sanitize.js +16 -0
- package/src/execution/l2-resource-guards.js +19 -0
- package/src/execution/l3-invariant-checker.js +5 -0
- package/src/execution/l4-containment.js +6 -0
- package/src/execution/runtime-guards.js +106 -0
- package/src/execution/strategy-identity.js +162 -0
- package/src/execution/tool-interceptor.js +7 -0
- package/src/execution/tool-result-classifier.js +63 -0
- package/src/integration/canary-deploy.js +143 -0
- package/src/integration/collector.js +59 -0
- package/src/integration/error-recovery.js +6 -0
- package/src/integration/event-bus.js +66 -0
- package/src/integration/health-checker.js +57 -0
- package/src/integration/logger.js +39 -0
- package/src/integration/message-handler.js +611 -0
- package/src/integration/opencode-db.js +153 -0
- package/src/integration/orchestration.js +419 -0
- package/src/integration/part-provenance.js +65 -0
- package/src/integration/rate-limiter.js +55 -0
- package/src/integration/release-gate.js +336 -0
- package/src/integration/rollback-manager.js +164 -0
- package/src/integration/router-adapter.js +269 -0
- package/src/integration/telemetry.js +45 -0
- package/src/integration/update-checker.js +10 -0
- package/src/persistence/event-sourcing.js +75 -0
- package/src/persistence/memory.js +501 -0
- package/src/persistence/migration-runner.js +16 -0
- package/src/persistence/persistence-manager.js +39 -0
- package/src/persistence/transaction-log.js +157 -0
- package/src/policy/action-capabilities.js +116 -0
- package/src/policy/action-policy.js +4 -0
- package/src/policy/assessment-engine.js +104 -0
- package/src/policy/assumption-tracking.js +66 -0
- package/src/policy/budget-enforcer.js +7 -0
- package/src/policy/config-validator.js +102 -0
- package/src/policy/execution-assessment.js +142 -0
- package/src/policy/failure-classification.js +5 -0
- package/src/policy/feature-flags.js +65 -0
- package/src/policy/governance-enforcement.js +118 -0
- package/src/policy/locale.js +15 -0
- package/src/policy/multi-signer.js +151 -0
- package/src/policy/policy-state-machine.js +97 -0
- package/src/policy/ponytail-constraint.js +38 -0
- package/src/policy/project-inspector.js +93 -0
- package/src/policy/query-builder.js +14 -0
- package/src/policy/request-classifier.js +79 -0
- package/src/policy/risk-engine.js +266 -0
- package/src/policy/scope-enforcement.js +140 -0
- package/src/policy/secret-scanner.js +68 -0
- package/src/policy/skill-routing.js +104 -0
- package/src/policy/strategy-capabilities.js +211 -0
- package/src/policy/strategy.js +6 -0
- package/src/policy/uncertainty.js +117 -0
- package/src/shared/container.js +44 -0
- package/src/shared/decision-types.js +24 -0
- package/src/shared/simple-test.js +160 -0
- package/src/shared/wam-events.js +52 -0
- package/src/skills/engine.js +1705 -0
- package/src/skills/skill-registry.js +19 -0
- package/src/skills/skill-routing.js +340 -0
- package/src/state/lifecycle-manager.js +113 -0
- package/src/state/operational-state.js +198 -0
- package/src/state/projections.js +47 -0
- package/src/state/replay-engine.js +5 -0
- package/src/state/requirement-ownership.js +20 -0
- package/src/state/requirement-state.js +152 -0
- package/src/state/run-event-identity.js +172 -0
- package/src/state/state-engine.js +19 -0
- package/src/state/state-machine.js +119 -0
- package/src/state/state-schema.js +318 -0
- package/src/state/state-store.js +335 -0
- package/src/state/state-transition.js +84 -0
- package/src/state/task-dependencies.js +287 -0
- package/src/state/task-execution.js +217 -0
- package/src/state/task-lifecycle.js +59 -0
- package/src/state/task-runs.js +361 -0
- package/src/state/task-state-file.js +86 -0
- package/src/state/task-state.js +41 -0
- package/src/state/task-status.js +54 -0
- package/src/state/task-store.js +48 -0
- package/src/state/wam-state.js +148 -0
- package/src/verification/completion-gate-simple.js +8 -0
- package/src/verification/completion-gate.js +183 -0
- package/src/verification/contract.js +9 -0
- package/src/verification/contradiction-resolution.js +255 -0
- package/src/verification/diagnostic-engine.js +659 -0
- package/src/verification/false-completion-prevention.js +100 -0
- package/src/verification/hook-validator.js +6 -0
- package/src/verification/requirements.js +6 -0
- package/src/verification/verification-context.js +162 -0
- package/src/verification/verification-lifecycle.js +66 -0
- package/src/verification/verification-model.js +89 -0
- package/src/verification/verification-persistence.js +129 -0
- package/src/verification/verification-policy.js +127 -0
- package/src/verification/verification.js +415 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real Context Router Selector for Benchmark
|
|
3
|
+
* Bridges benchmark scenarios to the canonical WAM Context Router.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ContextGraph, NODE_TYPES, EDGE_TYPES } from "./context/context-graph.js";
|
|
7
|
+
import { resolveContext } from "./context/context-router.js";
|
|
8
|
+
import { estimateTokens } from "./context/context-optimization-metrics.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Build a ContextGraph instance from a benchmark scenario object.
|
|
12
|
+
*/
|
|
13
|
+
export function buildBenchmarkGraph(scenario) {
|
|
14
|
+
const graph = new ContextGraph();
|
|
15
|
+
|
|
16
|
+
// Add all scenario nodes
|
|
17
|
+
if (scenario.nodes) {
|
|
18
|
+
for (const [id, node] of Object.entries(scenario.nodes)) {
|
|
19
|
+
graph.addNode({
|
|
20
|
+
id,
|
|
21
|
+
type: node.type && NODE_TYPES.includes(node.type) ? node.type : "requirement",
|
|
22
|
+
content: node.content || "",
|
|
23
|
+
metadata: {
|
|
24
|
+
freshness: node.freshness ?? 1.0,
|
|
25
|
+
importance: node.importance ?? 1.0,
|
|
26
|
+
aliases: node.aliases || [],
|
|
27
|
+
admission: node.admission || "CONDITIONAL",
|
|
28
|
+
...node.metadata
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Add explicit requires edges if provided.
|
|
35
|
+
// Change 04: Do not derive additional edges from requiredIds when explicit graph is provided.
|
|
36
|
+
const addedEdges = new Set();
|
|
37
|
+
const hasExplicitGraph = Array.isArray(scenario.requires);
|
|
38
|
+
|
|
39
|
+
if (hasExplicitGraph) {
|
|
40
|
+
for (const req of scenario.requires) {
|
|
41
|
+
const requested = req.type || "requires";
|
|
42
|
+
const type = EDGE_TYPES.includes(requested)
|
|
43
|
+
? requested
|
|
44
|
+
: requested === "requires"
|
|
45
|
+
? "requires_completion"
|
|
46
|
+
: "related_to";
|
|
47
|
+
const key = `${req.from}->${req.to}:${type}`;
|
|
48
|
+
if (!addedEdges.has(key)) {
|
|
49
|
+
addedEdges.add(key);
|
|
50
|
+
graph.addEdge({
|
|
51
|
+
from: req.from,
|
|
52
|
+
to: req.to,
|
|
53
|
+
type,
|
|
54
|
+
weight: req.weight ?? 1.0
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
} else if (scenario.requiredIds) {
|
|
59
|
+
// Legacy synthetic graph derived from requiredIds
|
|
60
|
+
const taskId = scenario.taskId || "task";
|
|
61
|
+
for (const reqId of scenario.requiredIds) {
|
|
62
|
+
const key = `${taskId}->${reqId}:requires_completion`;
|
|
63
|
+
if (!addedEdges.has(key) && graph.getNode(reqId) && graph.getNode(taskId)) {
|
|
64
|
+
addedEdges.add(key);
|
|
65
|
+
graph.addEdge({
|
|
66
|
+
from: taskId,
|
|
67
|
+
to: reqId,
|
|
68
|
+
type: "requires_completion",
|
|
69
|
+
weight: 1.0
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Attach metadata tag indicating synthetic vs explicit ground truth (Change 04)
|
|
76
|
+
graph.metadata = {
|
|
77
|
+
syntheticGroundTruth: !hasExplicitGraph
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
return graph;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* WAM Router selector function conforming to benchmark selector signature.
|
|
85
|
+
* @param {Object} [options]
|
|
86
|
+
* @param {number} [options.budget=4000]
|
|
87
|
+
*/
|
|
88
|
+
export function wamRouterSelector(options = {}) {
|
|
89
|
+
const tokenBudget = options.budget ?? 4000;
|
|
90
|
+
return function select(scenario) {
|
|
91
|
+
const graph = buildBenchmarkGraph(scenario);
|
|
92
|
+
const taskId = scenario.taskId && graph.getNode(scenario.taskId) ? scenario.taskId : (graph.getNode("task") ? "task" : (scenario.taskId || graph.nodes.values().next().value?.id || "task"));
|
|
93
|
+
|
|
94
|
+
let result;
|
|
95
|
+
try {
|
|
96
|
+
result = resolveContext(graph, { taskId, maxTokens: tokenBudget });
|
|
97
|
+
} catch (e) {
|
|
98
|
+
// Router error: the selection algorithm could not execute.
|
|
99
|
+
// This is distinct from a page fault (where the selected context
|
|
100
|
+
// was insufficient and the system recovered additional context).
|
|
101
|
+
const serializedError = {
|
|
102
|
+
name: e?.name ?? "Error",
|
|
103
|
+
message: e?.message ?? String(e),
|
|
104
|
+
stack: e?.stack ?? null
|
|
105
|
+
};
|
|
106
|
+
return {
|
|
107
|
+
status: "ERROR",
|
|
108
|
+
errorType: "ROUTER_ERROR",
|
|
109
|
+
error: serializedError
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const selectedIds = (result.nodes || []).map(n => n.id);
|
|
114
|
+
const usedIds = selectedIds; // Router-selected nodes are used
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
status: "OK",
|
|
118
|
+
selectedIds,
|
|
119
|
+
usedIds: undefined, // Change 05: Do not infer usedIds from selectedIds
|
|
120
|
+
pageFaults: result.sufficient ? 0 : 1,
|
|
121
|
+
reacquiredTokens: 0,
|
|
122
|
+
routerResult: result
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence Engine — produces validated evidence from observation + assessment.
|
|
3
|
+
*
|
|
4
|
+
* Decoupled from execution-engine: builds evidence records via the
|
|
5
|
+
* evidence-lineage store, then routes them to the lineage graph when
|
|
6
|
+
* the observation carries a requirement binding.
|
|
7
|
+
*
|
|
8
|
+
* Evidence is what proves a hypothesis. An evidence record must:
|
|
9
|
+
* 1. Be created from a concrete observation (or explicit content).
|
|
10
|
+
* 2. Carry provenance (hypothesisId, source).
|
|
11
|
+
* 3. Optionally link to a requirement when the execution was targeted.
|
|
12
|
+
*
|
|
13
|
+
* Does NOT own: hypothesis status transitions (state-machine.js) or
|
|
14
|
+
* observation persistence (observation-engine.js).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { createEvidence, linkEvidenceToRequirement } from "./evidence-lineage.js";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Default evidence type for execution-engine outputs.
|
|
21
|
+
*/
|
|
22
|
+
export const EVIDENCE_TYPE_TOOL_OUTPUT = "TOOL_OUTPUT";
|
|
23
|
+
export const EVIDENCE_SOURCE_EXECUTION = "execution-engine";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Pure content serializer — turns a tool result into a stable string content.
|
|
27
|
+
* Centralized so evidence content shape stays consistent.
|
|
28
|
+
*
|
|
29
|
+
* @param {*} result
|
|
30
|
+
* @returns {string}
|
|
31
|
+
*/
|
|
32
|
+
export function serializeEvidenceContent(result) {
|
|
33
|
+
if (result === undefined || result === null) return "ok";
|
|
34
|
+
if (typeof result === "string") return result;
|
|
35
|
+
try {
|
|
36
|
+
return JSON.stringify(result);
|
|
37
|
+
} catch {
|
|
38
|
+
return String(result);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a requirementId from a possibly-incomplete requirement object
|
|
44
|
+
* or a pre-resolved id. Returns the id only when it is a non-empty string;
|
|
45
|
+
* otherwise returns undefined (evidence stays unbound).
|
|
46
|
+
*
|
|
47
|
+
* @param {object} [args]
|
|
48
|
+
* @param {object} [args.requirement] - requirement object; may be incomplete
|
|
49
|
+
* @param {string} [args.requirementId] - pre-resolved id (may be undefined)
|
|
50
|
+
* @returns {string|undefined}
|
|
51
|
+
*/
|
|
52
|
+
export function resolveRequirementId({ requirement, requirementId } = {}) {
|
|
53
|
+
if (requirement && typeof requirement === "object" && typeof requirement.id === "string" && requirement.id.length > 0) {
|
|
54
|
+
return requirement.id;
|
|
55
|
+
}
|
|
56
|
+
if (typeof requirementId === "string" && requirementId.length > 0) {
|
|
57
|
+
return requirementId;
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Build the evidence payload from a successful observation.
|
|
64
|
+
* Pure: no I/O, no lineage graph mutation.
|
|
65
|
+
*
|
|
66
|
+
* @param {object} args
|
|
67
|
+
* @param {string} [args.requirementId] - pre-resolved id; ignored if invalid
|
|
68
|
+
* @param {object} [args.requirement] - requirement object; only used when .id is a non-empty string
|
|
69
|
+
* @param {*} args.result - tool output (string|object|primitive)
|
|
70
|
+
* @param {string} [args.type] - evidence type (default TOOL_OUTPUT)
|
|
71
|
+
* @param {string} [args.source] - source identifier (default execution-engine)
|
|
72
|
+
* @param {string} args.hypothesisId
|
|
73
|
+
* @returns {object} payload ready for createEvidence
|
|
74
|
+
*/
|
|
75
|
+
export function buildEvidencePayload({
|
|
76
|
+
requirement,
|
|
77
|
+
requirementId,
|
|
78
|
+
result,
|
|
79
|
+
type = EVIDENCE_TYPE_TOOL_OUTPUT,
|
|
80
|
+
source = EVIDENCE_SOURCE_EXECUTION,
|
|
81
|
+
hypothesisId,
|
|
82
|
+
}) {
|
|
83
|
+
const resolvedId = resolveRequirementId({ requirement, requirementId });
|
|
84
|
+
return {
|
|
85
|
+
requirementId: resolvedId,
|
|
86
|
+
content: serializeEvidenceContent(result),
|
|
87
|
+
type,
|
|
88
|
+
source,
|
|
89
|
+
hypothesisId,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Create evidence from a successful tool observation.
|
|
95
|
+
* Pure wrapper around evidence-lineage: returns the evidence record.
|
|
96
|
+
*
|
|
97
|
+
* @param {string} taskId
|
|
98
|
+
* @param {object} payload - see buildEvidencePayload
|
|
99
|
+
* @param {string} root
|
|
100
|
+
* @returns {object} created evidence record
|
|
101
|
+
*/
|
|
102
|
+
export function createExecutionEvidence(taskId, payload, root) {
|
|
103
|
+
return createEvidence(taskId, payload, root);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Link evidence into the lineage graph once the observation has been recorded.
|
|
108
|
+
* Requires both observationId and requirementId; otherwise this is a no-op
|
|
109
|
+
* (unbound evidence — the hypothesis chain still references it via facts).
|
|
110
|
+
*
|
|
111
|
+
* @param {object} args
|
|
112
|
+
* @param {string} args.evidenceId
|
|
113
|
+
* @param {string} args.requirementId
|
|
114
|
+
* @param {string} args.hypothesisId
|
|
115
|
+
* @param {string|null} args.experimentId
|
|
116
|
+
* @param {string|null} args.observationId
|
|
117
|
+
* @param {string} args.taskId
|
|
118
|
+
* @param {string} args.taskRoot
|
|
119
|
+
* @returns {boolean} true when the lineage was linked; false when skipped.
|
|
120
|
+
*/
|
|
121
|
+
export function linkEvidenceIfBound({
|
|
122
|
+
evidenceId,
|
|
123
|
+
requirementId,
|
|
124
|
+
hypothesisId,
|
|
125
|
+
experimentId,
|
|
126
|
+
observationId,
|
|
127
|
+
taskId,
|
|
128
|
+
taskRoot,
|
|
129
|
+
}) {
|
|
130
|
+
if (!evidenceId || !requirementId || !observationId) return false;
|
|
131
|
+
linkEvidenceToRequirement(
|
|
132
|
+
evidenceId,
|
|
133
|
+
requirementId,
|
|
134
|
+
hypothesisId,
|
|
135
|
+
experimentId ?? null,
|
|
136
|
+
observationId,
|
|
137
|
+
taskId,
|
|
138
|
+
taskRoot,
|
|
139
|
+
);
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Full success-path: build → create → (later) link.
|
|
145
|
+
* Returns the evidence record so the caller can carry its id into the
|
|
146
|
+
* observation's facts list.
|
|
147
|
+
*
|
|
148
|
+
* Safely resolves requirement binding: when args.requirement is incomplete
|
|
149
|
+
* or args.requirementId is not a non-empty string, the produced evidence
|
|
150
|
+
* stays unbound (no requirement.id access, no lineage link).
|
|
151
|
+
*
|
|
152
|
+
* @param {string} taskId
|
|
153
|
+
* @param {string} taskRoot
|
|
154
|
+
* @param {object} args - see buildEvidencePayload
|
|
155
|
+
* @returns {{evidence: object, payload: object}}
|
|
156
|
+
*/
|
|
157
|
+
export function produceExecutionEvidence(taskId, taskRoot, args) {
|
|
158
|
+
const payload = buildEvidencePayload(args);
|
|
159
|
+
const evidence = createExecutionEvidence(taskId, payload, taskRoot);
|
|
160
|
+
return { evidence, payload };
|
|
161
|
+
}
|