@kontourai/flow-agents 3.6.0 → 3.7.0
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/CHANGELOG.md +7 -0
- package/build/src/builder-flow-run-adapter.d.ts +22 -2
- package/build/src/builder-flow-run-adapter.js +93 -28
- package/build/src/builder-flow-runtime.d.ts +8 -3
- package/build/src/builder-flow-runtime.js +308 -47
- package/build/src/cli/assignment-provider.d.ts +4 -7
- package/build/src/cli/assignment-provider.js +67 -13
- package/build/src/cli/builder-run.js +14 -18
- package/build/src/cli/workflow-sidecar.d.ts +28 -4
- package/build/src/cli/workflow-sidecar.js +801 -97
- package/build/src/cli/workflow.js +290 -42
- package/build/src/flow-kit/validate.d.ts +17 -0
- package/build/src/flow-kit/validate.js +340 -2
- package/build/src/index.js +5 -5
- package/build/src/lib/observed-command.d.ts +7 -0
- package/build/src/lib/observed-command.js +100 -0
- package/build/src/tools/generate-context-map.js +5 -3
- package/context/scripts/hooks/lib/kit-catalog.js +1 -1
- package/context/scripts/hooks/stop-goal-fit.js +78 -9
- package/docs/context-map.md +22 -20
- package/docs/developer-architecture.md +1 -1
- package/docs/public-workflow-cli.md +76 -7
- package/docs/skills-map.md +51 -27
- package/docs/spec/builder-flow-runtime.md +41 -40
- package/docs/workflow-usage-guide.md +109 -42
- package/evals/fixtures/hook-influence/cases.json +2 -2
- package/evals/integration/test_builder_entry_enforcement.sh +52 -41
- package/evals/integration/test_builder_step_producers.sh +297 -6
- package/evals/integration/test_bundle_install.sh +212 -63
- package/evals/integration/test_critique_supersession_roundtrip.sh +21 -8
- package/evals/integration/test_current_json_per_actor.sh +12 -0
- package/evals/integration/test_dual_emit_flow_step.sh +62 -43
- package/evals/integration/test_flowdef_session_activation.sh +145 -25
- package/evals/integration/test_flowdef_session_history_preservation.sh +23 -21
- package/evals/integration/test_gate_lockdown.sh +3 -5
- package/evals/integration/test_goal_fit_hook.sh +60 -2
- package/evals/integration/test_liveness_verdict.sh +14 -17
- package/evals/integration/test_phase_map_and_gate_claim.sh +63 -38
- package/evals/integration/test_public_workflow_cli.sh +325 -11
- package/evals/integration/test_pull_work_liveness_preflight.sh +22 -66
- package/evals/integration/test_sidecar_field_preservation.sh +36 -11
- package/evals/integration/test_workflow_sidecar_writer.sh +277 -44
- package/evals/integration/test_workflow_steering_hook.sh +15 -38
- package/evals/run.sh +2 -0
- package/evals/static/test_builder_skill_coherence.sh +247 -0
- package/evals/static/test_library_exports.sh +5 -2
- package/evals/static/test_workflow_skills.sh +13 -325
- package/kits/builder/flows/build.flow.json +22 -0
- package/kits/builder/flows/shape.flow.json +9 -9
- package/kits/builder/kit.json +70 -16
- package/kits/builder/skills/builder-shape/SKILL.md +75 -75
- package/kits/builder/skills/continue-work/SKILL.md +45 -106
- package/kits/builder/skills/deliver/SKILL.md +96 -442
- package/kits/builder/skills/design-probe/SKILL.md +40 -139
- package/kits/builder/skills/evidence-gate/SKILL.md +59 -201
- package/kits/builder/skills/execute-plan/SKILL.md +54 -125
- package/kits/builder/skills/fix-bug/SKILL.md +42 -132
- package/kits/builder/skills/gate-review/SKILL.md +60 -211
- package/kits/builder/skills/idea-to-backlog/SKILL.md +63 -244
- package/kits/builder/skills/learning-review/SKILL.md +63 -170
- package/kits/builder/skills/pickup-probe/SKILL.md +54 -111
- package/kits/builder/skills/plan-work/SKILL.md +51 -185
- package/kits/builder/skills/pull-work/SKILL.md +136 -485
- package/kits/builder/skills/release-readiness/SKILL.md +66 -107
- package/kits/builder/skills/review-work/SKILL.md +89 -176
- package/kits/builder/skills/tdd-workflow/SKILL.md +53 -147
- package/kits/builder/skills/verify-work/SKILL.md +101 -113
- package/package.json +2 -2
- package/scripts/hooks/lib/kit-catalog.js +1 -1
- package/scripts/hooks/stop-goal-fit.js +78 -9
- package/src/builder-flow-run-adapter.ts +118 -32
- package/src/builder-flow-runtime.ts +331 -61
- package/src/cli/assignment-provider-lock.test.mjs +83 -0
- package/src/cli/assignment-provider.ts +62 -13
- package/src/cli/builder-flow-run-adapter.test.mjs +4 -2
- package/src/cli/builder-flow-runtime.test.mjs +194 -8
- package/src/cli/builder-run.ts +3 -9
- package/src/cli/kit-metadata-security.test.mjs +232 -6
- package/src/cli/public-api.test.mjs +15 -0
- package/src/cli/workflow-sidecar-execution-proof.test.mjs +90 -0
- package/src/cli/workflow-sidecar.ts +724 -97
- package/src/cli/workflow.ts +277 -40
- package/src/flow-kit/validate.ts +320 -2
- package/src/index.ts +6 -5
- package/src/lib/observed-command.ts +96 -0
- package/src/tools/generate-context-map.ts +5 -3
|
@@ -1,234 +1,83 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "gate-review"
|
|
3
|
-
description: "
|
|
3
|
+
description: "Explicit advisory extension for reviewing apparent workflow gate blocks or misses from a completed trust bundle."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Gate Review
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## Role and Boundary
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
**Role:** explicit advisory extension outside generic routing.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
- Uses `@kontourai/surface`'s `resolveInquiry(bundle, inquiry)` to produce canonical `InquiryRecord` outputs per ADR 0003.
|
|
21
|
-
- If `@kontourai/surface` is unavailable, logs a warning and skips output. No bespoke fork fallback.
|
|
22
|
-
- **Builder Kit build flow**: gate-review operates on sessions created by `deliver` or `plan-work` with `--flow-id builder.build`. The session's trust.bundle contains both declared builder.* claims (e.g. `builder.verify.tests`) and legacy workflow.* shadow claims. Gate-review classifies all claims present in the bundle regardless of claimType prefix.
|
|
12
|
+
Use only when the user explicitly asks to assess a suspected gate false block,
|
|
13
|
+
missed block, or gate behavior at closeout. This extension does not select a
|
|
14
|
+
flow, advance a run, apply a fix, or replace review, verification, or
|
|
15
|
+
learning-review.
|
|
16
|
+
|
|
17
|
+
It owns **no step-gate evidence**. It consumes existing trust data and produces
|
|
18
|
+
advisory review output only. Any remediation enters the normal planning and
|
|
19
|
+
delivery process after human selection.
|
|
23
20
|
|
|
24
21
|
## Inputs
|
|
25
22
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"value": "pass|fail|skip",
|
|
44
|
-
"createdAt": "<ISO-8601>",
|
|
45
|
-
"updatedAt": "<ISO-8601>",
|
|
46
|
-
"status": "verified|disputed|assumed|proposed|rejected|stale|unknown"
|
|
47
|
-
}
|
|
48
|
-
],
|
|
49
|
-
"evidence": [...],
|
|
50
|
-
"events": [...],
|
|
51
|
-
"policies": []
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
The claim `status` field is the canonically derived status (computed by `@kontourai/surface.deriveClaimStatus`). Status values and their meaning for gate-review:
|
|
56
|
-
|
|
57
|
-
| `status` | Meaning |
|
|
58
|
-
| --- | --- |
|
|
59
|
-
| `verified` | Claim confirmed by matching evidence; a pass. |
|
|
60
|
-
| `disputed` | Claim contradicted by evidence; a genuine failure. |
|
|
61
|
-
| `assumed` | Claim accepted without direct evidence (e.g. `accepted_gap` criterion, `skip` check). |
|
|
62
|
-
| `proposed` | Claim written but not yet evaluated. |
|
|
63
|
-
| `rejected` | Claim explicitly rejected. |
|
|
64
|
-
| `stale` | Claim data is outdated; gate had stale input. |
|
|
65
|
-
| `unknown` | No event found; claim was never evaluated. |
|
|
66
|
-
|
|
67
|
-
- `state.json` at `.kontourai/flow-agents/<slug>/state.json` (lifecycle context; not a trust input).
|
|
68
|
-
- Optional: seeded fixture `trust.bundle` path for testing before Phase 1 produces real bundles.
|
|
69
|
-
|
|
70
|
-
## Artifact Contract
|
|
71
|
-
|
|
72
|
-
Write the following artifacts under `.kontourai/flow-agents/<slug>/`:
|
|
73
|
-
|
|
74
|
-
### `<slug>--gate-review.md`
|
|
75
|
-
|
|
76
|
-
Human-readable summary. Sections:
|
|
77
|
-
|
|
78
|
-
- `## Session` — slug, state.json phase/status at review time, trust.bundle schemaVersion
|
|
79
|
-
- `## Gate Fires` — one entry per classified InquiryRecord
|
|
80
|
-
- `## Suspected Misses` — missed_block InquiryRecords; expected criteria absent from the bundle
|
|
81
|
-
- `## Advisory Fixes` — proposed (NOT applied) fixes per InquiryRecord (from `answer.value.advisoryFix`)
|
|
82
|
-
- `## NOT_VERIFIED Gaps` — any classification that could not be completed (e.g. trust.bundle absent, Surface unavailable)
|
|
83
|
-
- `## Routed To` — `learning-review` invocation record
|
|
84
|
-
|
|
85
|
-
### `gate-review.inquiries.json`
|
|
86
|
-
|
|
87
|
-
Machine-readable array of canonical `InquiryRecord` objects validated against the hachure schema at `node_modules/hachure/schemas/inquiry-record.schema.json` (canonical `$id`: `https://kontourai.io/schemas/surface/inquiry-record.schema.json`).
|
|
88
|
-
|
|
89
|
-
Required fields per schema: `id`, `inquiry`, `outcome`, `resolutionPath`, `inputSnapshot`, `statusFunctionVersion`, `resolvedAt`.
|
|
90
|
-
|
|
91
|
-
The `outcome` field is the canonical Surface value: `"matched"` (claim found and resolved), `"derived"` (rule-based resolution), or `"unsupported"` (no matching claim — absent criterion).
|
|
92
|
-
|
|
93
|
-
The `answer` field carries gate-review's value-add:
|
|
94
|
-
- `answer.status` — canonical `TrustStatus` of the resolved claim (`"unknown"` when absent).
|
|
95
|
-
- `answer.value` — gate-review advisory object:
|
|
96
|
-
```json
|
|
97
|
-
{
|
|
98
|
-
"calibration": "correct | false_block | missed_block",
|
|
99
|
-
"advisoryFix": "<non-empty advisory string>",
|
|
100
|
-
"gateFired": true,
|
|
101
|
-
"sessionSlug": "<slug>"
|
|
102
|
-
}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
The `calibration` field in `answer.value` is derived from `(outcome, answer.status, blockSignal.blocked)`:
|
|
106
|
-
- `"matched"` + `"disputed"|"rejected"` + `blocked=true` → `"correct"`
|
|
107
|
-
- `"matched"` + `"verified"|"assumed"` + `blocked=true` → `"false_block"`
|
|
108
|
-
- `"matched"` + `"stale"|"unknown"|"proposed"` + `blocked=false` → `"missed_block"`
|
|
109
|
-
- `"unsupported"` (absent claim) → `"missed_block"`
|
|
110
|
-
|
|
111
|
-
The `advisoryFix` in `answer.value` must be non-empty for every record. No record may have `auto_applied: true` or instruct automatic changes.
|
|
112
|
-
|
|
113
|
-
Example record:
|
|
114
|
-
```json
|
|
115
|
-
{
|
|
116
|
-
"id": "my-session-gr-1",
|
|
117
|
-
"inquiry": {
|
|
118
|
-
"id": "my-session-gr-1",
|
|
119
|
-
"question": "Was gate action on claim my-session/unit-tests... (status: verified) justified?",
|
|
120
|
-
"askedBy": "gate-review",
|
|
121
|
-
"askedAt": "2026-06-24T00:00:00Z",
|
|
122
|
-
"target": { "subjectType": "workflow-check", "subjectId": "my-session/unit-tests", "fieldOrBehavior": "unit tests pass" }
|
|
123
|
-
},
|
|
124
|
-
"outcome": "matched",
|
|
125
|
-
"resolutionPath": { "claimIds": ["my-session/unit-tests.flow-agents.workflow.unit tests pass"] },
|
|
126
|
-
"answer": {
|
|
127
|
-
"status": "verified",
|
|
128
|
-
"value": {
|
|
129
|
-
"calibration": "false_block",
|
|
130
|
-
"advisoryFix": "Investigate why the gate blocked when claim ... has status verified ...",
|
|
131
|
-
"gateFired": true,
|
|
132
|
-
"sessionSlug": "my-session"
|
|
133
|
-
}
|
|
134
|
-
},
|
|
135
|
-
"inputSnapshot": [{ "claimId": "my-session/unit-tests.flow-agents.workflow.unit tests pass", "status": "verified" }],
|
|
136
|
-
"statusFunctionVersion": "1",
|
|
137
|
-
"resolvedAt": "2026-06-24T00:00:00Z"
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
Invariants:
|
|
142
|
-
- Every record must have a non-empty `answer.value.advisoryFix`.
|
|
143
|
-
- No record may have `auto_applied: true`.
|
|
144
|
-
- `answer.value.calibration` must be one of `"correct"`, `"false_block"`, or `"missed_block"`.
|
|
145
|
-
|
|
146
|
-
After writing `gate-review.inquiries.json`, invoke `learning-review` passing the inquiries artifact path as an additional reviewer-notes input. Learning-review writes `learning.json` via `npm run workflow:sidecar -- record-learning`. Do NOT call `record-learning` from gate-review directly.
|
|
147
|
-
|
|
148
|
-
## Bundle-Claim to InquiryRecord Mapping
|
|
149
|
-
|
|
150
|
-
| Bundle claim condition | outcome | calibration | Rationale |
|
|
151
|
-
| --- | --- | --- | --- |
|
|
152
|
-
| Gate blocked AND claim has `status: "disputed"` or `"rejected"` | `matched` | `correct` | Gate saw a genuine failure; block was warranted. |
|
|
153
|
-
| Gate blocked AND claim has `status: "verified"` or `"assumed"` | `matched` | `false_block` | Gate blocked despite passing claims — acted on stale or incorrect data. |
|
|
154
|
-
| An expected claim is absent from the bundle entirely | `unsupported` | `missed_block` | Gate had no claim to evaluate. |
|
|
155
|
-
| A claim has `status: "stale"` and the gate did NOT block | `matched` | `missed_block` | Stale claim was present but gate did not fire on it. |
|
|
156
|
-
| A claim has `status: "unknown"` with no evidence trace | `matched` | `missed_block` | Claim was never evaluated; gate had no resolved evidence. |
|
|
157
|
-
|
|
158
|
-
Cross-reference with `state.json` phase at the time of the block to confirm the block was in an active workflow phase (not planning or archived).
|
|
159
|
-
|
|
160
|
-
## Workflow
|
|
23
|
+
Require an existing session directory with a `trust.bundle`; read `state.json`
|
|
24
|
+
only for lifecycle context. Use `flow-agents workflow status --session-dir
|
|
25
|
+
<session-dir>` to confirm the public run identity and current state when a run
|
|
26
|
+
is active.
|
|
27
|
+
|
|
28
|
+
The extension may also use expected criteria from the selected Work Item and
|
|
29
|
+
its adapters:
|
|
30
|
+
|
|
31
|
+
- **Work Item adapter:** acceptance criteria and expected workflow outcomes.
|
|
32
|
+
- **Repository adapter:** local policy and source context.
|
|
33
|
+
- **Change adapter:** review, verification, or release state associated with
|
|
34
|
+
the suspected block.
|
|
35
|
+
|
|
36
|
+
These adapters are provider-neutral. A GitHub issue or pull request is an
|
|
37
|
+
optional labeled example, not a required source of truth.
|
|
38
|
+
|
|
39
|
+
## Extension Behavior
|
|
161
40
|
|
|
162
|
-
|
|
41
|
+
This extension is observational: it may inspect a `builder.build` session but
|
|
42
|
+
does not select, start, resume, advance, pause, release, or cancel its flow.
|
|
43
|
+
It classifies existing information and returns advisory output for a human to
|
|
44
|
+
route through normal planning, delivery, or learning work.
|
|
163
45
|
|
|
164
|
-
|
|
46
|
+
## Classification Method
|
|
165
47
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
48
|
+
Use `@kontourai/surface`'s `resolveInquiry(bundle, inquiry)` to produce
|
|
49
|
+
canonical `InquiryRecord` objects. Do not invent a bespoke substitute when the
|
|
50
|
+
Surface dependency is unavailable.
|
|
169
51
|
|
|
170
|
-
|
|
52
|
+
For each observed gate fire and each expected-but-absent criterion, classify:
|
|
171
53
|
|
|
172
|
-
|
|
54
|
+
| Condition | Calibration |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| A blocked claim is `disputed` or `rejected` | `correct` |
|
|
57
|
+
| A blocked claim is `verified` or `assumed` | `false_block` |
|
|
58
|
+
| An expected claim is absent, stale, unknown, or unresolved without a block | `missed_block` |
|
|
173
59
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
2. For each claim in the bundle: builds a `SurfaceInquiry` with a canonical `target` and calls `resolveInquiry(bundle, inquiry)`.
|
|
179
|
-
3. For each absent expected criterion (from `acceptance.json`): builds a `SurfaceInquiry` targeting the missing claim; `resolveInquiry` returns `"unsupported"`.
|
|
180
|
-
4. Derives `calibration` from `(outcome, answer.status, blockSignal.blocked)` using `deriveGateCalibration`.
|
|
181
|
-
5. Composes advisory `advisoryFix` string using `gateAdvisoryFix`.
|
|
182
|
-
6. Sets `answer.value = { calibration, advisoryFix, gateFired, sessionSlug }`.
|
|
183
|
-
7. Strips Surface-internal fields (`identityLinkIds`, `transitiveRuleIds`) to conform to the hachure schema.
|
|
184
|
-
8. Validates each record against `inquiry-record.schema.json` (fail-open).
|
|
185
|
-
9. Writes `gate-review.inquiries.json`.
|
|
186
|
-
|
|
187
|
-
### Step 3 — Classify each InquiryRecord
|
|
188
|
-
|
|
189
|
-
Apply the InquiryRecord calibration mapping:
|
|
190
|
-
|
|
191
|
-
**`correct`** — `outcome: "matched"`, claim `status: "disputed"` or `"rejected"`, `blocked=true`:
|
|
192
|
-
> Gate saw a genuine failure. Block was warranted. Advisory fix: close the gap and re-run.
|
|
193
|
-
|
|
194
|
-
**`false_block`** — `outcome: "matched"`, claim `status: "verified"` or `"assumed"`, `blocked=true`:
|
|
195
|
-
> Gate blocked despite passing claims. Advisory fix: investigate the block trigger; add freshness check.
|
|
196
|
-
|
|
197
|
-
**`missed_block`** — `outcome: "unsupported"` (absent) OR `status: "stale"|"unknown"|"proposed"`, `blocked=false`:
|
|
198
|
-
> Gate had no claim to evaluate or claim was unresolved. Advisory fix: ensure record-evidence writes the claim.
|
|
199
|
-
|
|
200
|
-
### Step 4 — Write human-readable summary
|
|
201
|
-
|
|
202
|
-
Write `<slug>--gate-review.md` with sections for Session, Gate Fires, Suspected Misses, Advisory Fixes, NOT_VERIFIED Gaps, and Routed To.
|
|
203
|
-
|
|
204
|
-
Optionally use `buildTrustReport(bundle)` + `formatTrustReportSummary(report)` from `@kontourai/surface` for the trust-state summary section.
|
|
205
|
-
|
|
206
|
-
### Step 5 — Invoke learning-review
|
|
207
|
-
|
|
208
|
-
Pass the `gate-review.inquiries.json` path as additional reviewer notes to `learning-review`. Do not call `record-learning` directly. Learning-review owns the `learning.json` write and correction routing.
|
|
60
|
+
Every record must include a non-empty, advisory-only recommendation. Never
|
|
61
|
+
auto-apply or direct an automatic change. Preserve `InquiryRecord` schema
|
|
62
|
+
requirements, including identity, inquiry, outcome, resolution path, input
|
|
63
|
+
snapshot, status-function version, and resolution time.
|
|
209
64
|
|
|
210
|
-
|
|
211
|
-
```
|
|
212
|
-
gate-review InquiryRecords at .kontourai/flow-agents/<slug>/gate-review.inquiries.json:
|
|
213
|
-
- <N> record(s): calibration counts
|
|
214
|
-
- gate fired: <true/false>
|
|
215
|
-
- calibration: correct=<n>, false_block=<n>, missed_block=<n>
|
|
216
|
-
Use these as reviewer notes for the learning-review correction record.
|
|
217
|
-
```
|
|
65
|
+
## Output Responsibility
|
|
218
66
|
|
|
219
|
-
|
|
67
|
+
Produce these advisory artifacts in the existing session directory:
|
|
220
68
|
|
|
221
|
-
-
|
|
222
|
-
|
|
223
|
-
-
|
|
224
|
-
- **Surface gate**: if `@kontourai/surface` is unavailable, log and skip (no fork fallback).
|
|
69
|
+
- `<slug>--gate-review.md`: session context, gate fires, suspected misses,
|
|
70
|
+
advisory recommendations, and unresolved gaps.
|
|
71
|
+
- `gate-review.inquiries.json`: canonical `InquiryRecord` array.
|
|
225
72
|
|
|
226
|
-
|
|
73
|
+
Pass those outputs to `learning-review` as reviewer notes when learning review
|
|
74
|
+
is requested. Do not write learning output, modify flow definitions, or attach
|
|
75
|
+
step evidence on behalf of another primitive.
|
|
227
76
|
|
|
228
|
-
|
|
229
|
-
| --- | --- | --- |
|
|
230
|
-
| NV1 | trust.bundle absent at `origin/main @ a9b8fd6` — ADR 0010 Phase 1 not yet built | Phase 1 merged to main by `arch/goal-fit-gate-trust-bundle` owner |
|
|
231
|
-
| NV2 | AC1 seeded-session test fixture cannot be validated against real bundle shape | Phase 1 lands; coordinate with Phase 1 owner on exact bundle file path and claim array shape |
|
|
232
|
-
| NV3 | AC2 false_block / missed_block fixture depends on exact Phase 1 bundle structure | Same as NV2 |
|
|
77
|
+
## Standalone and No-Active-Run Behavior
|
|
233
78
|
|
|
234
|
-
|
|
79
|
+
This extension may analyze a completed session without an active run. If there
|
|
80
|
+
is no active run but the session and trust bundle exist, perform the advisory
|
|
81
|
+
review without creating or resuming a workflow. If the session or trust bundle
|
|
82
|
+
is absent, report `NOT_VERIFIED` and produce no new session, evidence, or
|
|
83
|
+
workflow run.
|