@kontourai/flow-agents 3.6.0 → 3.8.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.
Files changed (96) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/build/src/builder-flow-run-adapter.d.ts +22 -2
  3. package/build/src/builder-flow-run-adapter.js +93 -28
  4. package/build/src/builder-flow-runtime.d.ts +8 -3
  5. package/build/src/builder-flow-runtime.js +407 -51
  6. package/build/src/cli/assignment-provider.d.ts +4 -7
  7. package/build/src/cli/assignment-provider.js +80 -14
  8. package/build/src/cli/builder-run.js +14 -18
  9. package/build/src/cli/workflow-sidecar.d.ts +28 -4
  10. package/build/src/cli/workflow-sidecar.js +825 -103
  11. package/build/src/cli/workflow.js +301 -43
  12. package/build/src/flow-kit/validate.d.ts +17 -0
  13. package/build/src/flow-kit/validate.js +340 -2
  14. package/build/src/index.js +5 -5
  15. package/build/src/lib/observed-command.d.ts +7 -0
  16. package/build/src/lib/observed-command.js +100 -0
  17. package/build/src/tools/build-universal-bundles.js +53 -3
  18. package/build/src/tools/generate-context-map.js +5 -3
  19. package/context/scripts/hooks/lib/kit-catalog.js +1 -1
  20. package/context/scripts/hooks/stop-goal-fit.js +78 -9
  21. package/docs/context-map.md +22 -20
  22. package/docs/developer-architecture.md +1 -1
  23. package/docs/getting-started.md +9 -1
  24. package/docs/public-workflow-cli.md +76 -7
  25. package/docs/skills-map.md +51 -27
  26. package/docs/spec/builder-flow-runtime.md +75 -40
  27. package/docs/workflow-usage-guide.md +109 -42
  28. package/evals/fixtures/hook-influence/cases.json +2 -2
  29. package/evals/integration/test_builder_entry_enforcement.sh +52 -41
  30. package/evals/integration/test_builder_step_producers.sh +330 -6
  31. package/evals/integration/test_bundle_install.sh +318 -65
  32. package/evals/integration/test_bundle_lifecycle.sh +4 -6
  33. package/evals/integration/test_critique_supersession_roundtrip.sh +21 -8
  34. package/evals/integration/test_current_json_per_actor.sh +12 -0
  35. package/evals/integration/test_dual_emit_flow_step.sh +62 -43
  36. package/evals/integration/test_flowdef_session_activation.sh +145 -25
  37. package/evals/integration/test_flowdef_session_history_preservation.sh +23 -21
  38. package/evals/integration/test_gate_lockdown.sh +3 -5
  39. package/evals/integration/test_goal_fit_hook.sh +60 -2
  40. package/evals/integration/test_install_merge.sh +18 -8
  41. package/evals/integration/test_liveness_verdict.sh +14 -17
  42. package/evals/integration/test_phase_map_and_gate_claim.sh +63 -38
  43. package/evals/integration/test_public_workflow_cli.sh +334 -14
  44. package/evals/integration/test_pull_work_liveness_preflight.sh +22 -66
  45. package/evals/integration/test_sidecar_field_preservation.sh +36 -11
  46. package/evals/integration/test_workflow_sidecar_writer.sh +277 -44
  47. package/evals/integration/test_workflow_steering_hook.sh +15 -38
  48. package/evals/run.sh +2 -0
  49. package/evals/static/test_builder_skill_coherence.sh +247 -0
  50. package/evals/static/test_library_exports.sh +5 -2
  51. package/evals/static/test_universal_bundles.sh +44 -1
  52. package/evals/static/test_workflow_skills.sh +13 -325
  53. package/kits/builder/flows/build.flow.json +22 -0
  54. package/kits/builder/flows/shape.flow.json +9 -9
  55. package/kits/builder/kit.json +70 -16
  56. package/kits/builder/skills/builder-shape/SKILL.md +75 -75
  57. package/kits/builder/skills/continue-work/SKILL.md +45 -106
  58. package/kits/builder/skills/deliver/SKILL.md +96 -442
  59. package/kits/builder/skills/design-probe/SKILL.md +40 -139
  60. package/kits/builder/skills/evidence-gate/SKILL.md +59 -201
  61. package/kits/builder/skills/execute-plan/SKILL.md +54 -125
  62. package/kits/builder/skills/fix-bug/SKILL.md +42 -132
  63. package/kits/builder/skills/gate-review/SKILL.md +60 -211
  64. package/kits/builder/skills/idea-to-backlog/SKILL.md +63 -244
  65. package/kits/builder/skills/learning-review/SKILL.md +63 -170
  66. package/kits/builder/skills/pickup-probe/SKILL.md +54 -111
  67. package/kits/builder/skills/plan-work/SKILL.md +51 -185
  68. package/kits/builder/skills/pull-work/SKILL.md +136 -485
  69. package/kits/builder/skills/release-readiness/SKILL.md +66 -107
  70. package/kits/builder/skills/review-work/SKILL.md +89 -176
  71. package/kits/builder/skills/tdd-workflow/SKILL.md +53 -147
  72. package/kits/builder/skills/verify-work/SKILL.md +101 -113
  73. package/package.json +2 -2
  74. package/packaging/README.md +1 -1
  75. package/scripts/README.md +1 -1
  76. package/scripts/hooks/lib/kit-catalog.js +1 -1
  77. package/scripts/hooks/stop-goal-fit.js +78 -9
  78. package/scripts/install-codex-home.sh +63 -23
  79. package/scripts/install-owned-files.js +18 -2
  80. package/src/builder-flow-run-adapter.ts +118 -32
  81. package/src/builder-flow-runtime.ts +426 -64
  82. package/src/cli/assignment-provider-lock.test.mjs +83 -0
  83. package/src/cli/assignment-provider.ts +75 -14
  84. package/src/cli/builder-flow-run-adapter.test.mjs +4 -2
  85. package/src/cli/builder-flow-runtime.test.mjs +436 -18
  86. package/src/cli/builder-run.ts +3 -9
  87. package/src/cli/kit-metadata-security.test.mjs +232 -6
  88. package/src/cli/public-api.test.mjs +15 -0
  89. package/src/cli/workflow-sidecar-execution-proof.test.mjs +90 -0
  90. package/src/cli/workflow-sidecar.ts +746 -103
  91. package/src/cli/workflow.ts +288 -41
  92. package/src/flow-kit/validate.ts +320 -2
  93. package/src/index.ts +6 -5
  94. package/src/lib/observed-command.ts +96 -0
  95. package/src/tools/build-universal-bundles.ts +51 -3
  96. package/src/tools/generate-context-map.ts +5 -3
@@ -1,234 +1,83 @@
1
1
  ---
2
2
  name: "gate-review"
3
- description: "Enumerate gate fires and suspected misses from the session's Hachure trust.bundle, classify each as correct/false_block/missed_block using Surface's resolveInquiry to produce canonical InquiryRecords, route findings to learning-review, and propose advisory-only gate/flow fixes. Use mid-session after a goal-fit block or at closeout. Requires ADR 0010 Phase 1 (trust.bundle dual-write) to be present."
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
- Classify gate fires and suspected misses from the session's `trust.bundle` by calling Surface's `resolveInquiry` to produce canonical `InquiryRecord` outputs. Every finding is advisory — proposes a fix, never applies one.
8
+ ## Role and Boundary
9
9
 
10
- ## Contract
10
+ **Role:** explicit advisory extension outside generic routing.
11
11
 
12
- - **Advisory-only**: proposes fixes, never applies them. No finding may instruct auto-application of any fix.
13
- - Never writes to `scripts/hooks/` or any flow file.
14
- - Reads the local `trust.bundle` file only. Does NOT fall back to `command-log.jsonl`, `.goal-fit-block-streak.json`, or `evidence.json` direct reads as primary inputs.
15
- - If no `trust.bundle` is present at `.kontourai/flow-agents/<slug>/trust.bundle`, reports `NOT_VERIFIED` and stops. Does not silently degrade to bespoke sidecar reads.
16
- - Routes all telemetry, `learning.json` writes, and correction routing through `learning-review`. Gate-review never calls `record-learning` directly.
17
- - Reads `state.json` for lifecycle context only (phase, status). `state.json` is NOT a trust claim per ADR 0010.
18
- - Reads `context/gate-awareness.md` for vocabulary alignment when available.
19
- - Classification vocabulary (`correct`, `false_block`, `missed_block`) aligns with `context/gate-awareness.md` sections "Judge Gate Correctness" and "Missed-Block Diagnostic".
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
- - `trust.bundle` at `.kontourai/flow-agents/<slug>/trust.bundle` (produced by ADR 0010 Phase 1 dual-write in `workflow-sidecar`).
27
-
28
- **Dependency**: this file is NOT present at `origin/main @ a9b8fd6`; it requires ADR 0010 Phase 1 to be built and merged (owned by `arch/goal-fit-gate-trust-bundle`). Do not begin execution until Phase 1 has landed or a fixture is agreed with that owner.
29
-
30
- The bundle shape produced by `workflow-sidecar` (schemaVersion 3, source `"flow-agents/workflow-sidecar;statusFunctionVersion=1"`):
31
- ```json
32
- {
33
- "schemaVersion": 3,
34
- "source": "flow-agents/workflow-sidecar;statusFunctionVersion=1",
35
- "claims": [
36
- {
37
- "id": "<slug>-<checkId>.<surface>.<fieldOrBehavior>",
38
- "subjectType": "workflow-check",
39
- "subjectId": "<slug>/<checkId>",
40
- "surface": "flow-agents.workflow",
41
- "claimType": "workflow.check.test",
42
- "fieldOrBehavior": "<check summary>",
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
- ### Step 1 Locate trust.bundle
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
- Resolve `.kontourai/flow-agents/<slug>/trust.bundle`. The slug is the most recent active session (by `current.json` or `state.json` newest-mtime). If absent, surface the blocker:
46
+ ## Classification Method
165
47
 
166
- ```
167
- [gate-review] trust.bundle absent NOT_VERIFIED. Build ADR 0010 Phase 1 first.
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
- Stop and surface the blocker to the user.
52
+ For each observed gate fire and each expected-but-absent criterion, classify:
171
53
 
172
- ### Step 2 Load Surface and resolve inquiries
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
- Run `npm run workflow:sidecar -- gate-review <dir>`.
175
-
176
- The sidecar writer:
177
- 1. Loads `@kontourai/surface` (ESM, fail-open dynamic import).
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
- Example invocation note:
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
- ## Gates
67
+ Produce these advisory artifacts in the existing session directory:
220
68
 
221
- - **Advisory gate**: every InquiryRecord must have a non-empty `answer.value.advisoryFix`. Gate-review must not complete without one per record.
222
- - **No-auto-apply gate**: no record's advisory fix may instruct auto-application of any fix. Any proposed fix that starts with "Apply" or "Change" must be rephrased as "Propose" or "Investigate".
223
- - **Phase-1 dependency gate**: if `trust.bundle` is absent, surface the blocker to the user rather than degrading silently to bespoke sidecars.
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
- ## NOT_VERIFIED Gaps
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
- | Gap | Description | Resolution trigger |
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
- AC1 and AC2 are `not_verified` pending ADR 0010 Phase 1. The classification logic is spec-complete against the real bundle shape (confirmed by `workflow-sidecar ensure-session` + `record-evidence` probe). Re-run seeded-session tests after Phase 1 lands.
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.