opencode-swarm 7.140.4 → 7.140.6

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 (100) hide show
  1. package/.opencode/skills/plan/SKILL.md +40 -12
  2. package/.opencode/skills/swarm-pr-review/SKILL.md +2 -4
  3. package/.opencode/skills/swarm-pr-review/references/lane-output-recoverability.md +54 -0
  4. package/dist/agents/architect.d.ts +2 -1
  5. package/dist/background/candidate-contract.d.ts +1 -1
  6. package/dist/background/pending-delegations.d.ts +5 -0
  7. package/dist/background/pr-review-trigger-contract.d.ts +36 -0
  8. package/dist/cli/{config-doctor-qqe6172n.js → config-doctor-y5qeh18c.js} +3 -3
  9. package/dist/cli/{core-52k057mf.js → core-pwd9604e.js} +2 -2
  10. package/dist/cli/{curation-policy-9291bdat.js → curation-policy-avvb56x2.js} +6 -6
  11. package/dist/cli/curator-llm-factory-96pnc23w.js +61 -0
  12. package/dist/cli/{curator-04xqq68e.js → curator-q1nchgpg.js} +36 -36
  13. package/dist/cli/{evidence-summary-service-em58myd7.js → evidence-summary-service-18142mr3.js} +14 -11
  14. package/dist/cli/gate-evidence-smn2wqft.js +51 -0
  15. package/dist/cli/guardrail-explain-kyd89z8z.js +62 -0
  16. package/dist/cli/{guardrail-log-vb5zkegf.js → guardrail-log-cahp1ews.js} +4 -4
  17. package/dist/cli/{hive-promoter-z09khawt.js → hive-promoter-vcbcvcsh.js} +36 -36
  18. package/dist/cli/{index-ysa38bnr.js → index-1p72dtym.js} +3 -3
  19. package/dist/cli/{index-s8g7jh1k.js → index-2778hhh7.js} +2 -2
  20. package/dist/cli/{index-v3xhc7kg.js → index-4s7xgzbm.js} +1 -1
  21. package/dist/cli/{index-wk8s1m7b.js → index-4zxrkk1h.js} +217 -15
  22. package/dist/cli/{index-hz0refz4.js → index-56rqw2hs.js} +70 -29
  23. package/dist/cli/{index-djbhe0yh.js → index-5qd5vt2d.js} +38 -38
  24. package/dist/cli/{index-35qep0v7.js → index-912qz4y0.js} +88 -88
  25. package/dist/cli/{index-2rb3x0fk.js → index-92n3d5ky.js} +7 -7
  26. package/dist/cli/{index-ryq97w1x.js → index-bjqpdr83.js} +4 -4
  27. package/dist/cli/{index-c5kr20nz.js → index-c432knmy.js} +1 -1
  28. package/dist/cli/{index-v3x7j9ey.js → index-dtqjxfw9.js} +2 -2
  29. package/dist/cli/{index-hfwzxh3j.js → index-e58e3v0v.js} +12 -10
  30. package/dist/cli/{index-bfhwtdsw.js → index-epvhf50h.js} +3 -3
  31. package/dist/cli/{index-vrmkg8fm.js → index-fejfzy2j.js} +9 -9
  32. package/dist/cli/{index-mpytsq6k.js → index-h01wb18g.js} +2 -2
  33. package/dist/cli/{index-hxvkfx6t.js → index-jqsfsqbx.js} +15 -2
  34. package/dist/cli/{index-bn17ycxn.js → index-m9xrdjn0.js} +1 -1
  35. package/dist/cli/{index-a1fjhx4w.js → index-nakkgkkt.js} +37922 -35984
  36. package/dist/cli/index-p04qrwck.js +43 -0
  37. package/dist/cli/{index-arza4m4j.js → index-p2ty3eee.js} +2 -2
  38. package/dist/cli/{index-4hp8nvwb.js → index-p8kk34am.js} +3 -3
  39. package/dist/cli/{index-1kyex7z2.js → index-qwm6vdyv.js} +32 -1
  40. package/dist/cli/{index-dtam929z.js → index-qy1nq52t.js} +1 -1
  41. package/dist/cli/{index-rrb6cz2f.js → index-s1v0wza5.js} +6 -2
  42. package/dist/cli/{index-w4etfamq.js → index-t5pytnca.js} +2 -2
  43. package/dist/cli/{index-tj04dj06.js → index-thp186x0.js} +2 -2
  44. package/dist/cli/index-tjqzr3jc.js +623 -0
  45. package/dist/cli/{index-mrpfd1jx.js → index-vh05t3w5.js} +1 -1
  46. package/dist/cli/{index-7begd9aq.js → index-y9q9f6ms.js} +4 -4
  47. package/dist/cli/{index-v1an91bq.js → index-z0z9pe7b.js} +5 -5
  48. package/dist/cli/{index-hfjvepk2.js → index-z3s0a44b.js} +3 -3
  49. package/dist/cli/{index-pp5m7xga.js → index-zd4qhnr7.js} +70 -34
  50. package/dist/cli/{index-b8zgtz81.js → index-zsrtt42s.js} +34 -1
  51. package/dist/cli/index.js +35 -35
  52. package/dist/cli/{knowledge-escalator-gdjnwszd.js → knowledge-escalator-gj58za4g.js} +12 -12
  53. package/dist/cli/{knowledge-events-581x4q7n.js → knowledge-events-3m5jnnv6.js} +10 -10
  54. package/dist/cli/{knowledge-link-axx45d1h.js → knowledge-link-m9p80f4r.js} +5 -5
  55. package/dist/cli/{knowledge-store-ttg33482.js → knowledge-store-0vy8wbzd.js} +6 -6
  56. package/dist/cli/{knowledge-validator-8kywqt8b.js → knowledge-validator-mvcs8wf6.js} +8 -8
  57. package/dist/cli/{pending-delegations-btwqsvz4.js → pending-delegations-cxx9tezp.js} +4 -4
  58. package/dist/cli/{pr-subscriptions-83y1cdwv.js → pr-subscriptions-2sfnb599.js} +4 -4
  59. package/dist/cli/{runner-fh3r41nw.js → runner-mky3vvht.js} +6 -6
  60. package/dist/cli/{scan-cursor-j8ytdpam.js → scan-cursor-wznc7p7p.js} +7 -7
  61. package/dist/cli/{schema-6xfqtpvn.js → schema-k596bhds.js} +2 -2
  62. package/dist/cli/{scope-persistence-8c72jrgp.js → scope-persistence-0ny5fn07.js} +10 -5
  63. package/dist/cli/{skill-generator-n8vm1yhn.js → skill-generator-vrks0jjj.js} +14 -14
  64. package/dist/cli/{telemetry-fb44gpba.js → telemetry-0x6kszvk.js} +1 -1
  65. package/dist/cli/{worktree-collision-ownership-f28r473k.js → worktree-collision-ownership-wm5pse49.js} +8 -8
  66. package/dist/cli/worktree-isolation-zgk7314k.js +102 -0
  67. package/dist/cli/worktree-provisioning-owner-sjh7te1h.js +22 -0
  68. package/dist/commands/acknowledge-spec-drift.d.ts +4 -5
  69. package/dist/config/evidence-schema.d.ts +3 -3
  70. package/dist/config/index.d.ts +2 -2
  71. package/dist/config/plan-schema.d.ts +8 -0
  72. package/dist/config/schema.d.ts +2 -2
  73. package/dist/council/council-evidence-writer.d.ts +1 -1
  74. package/dist/gate-evidence.d.ts +117 -4
  75. package/dist/hooks/delegation-gate.d.ts +21 -0
  76. package/dist/hooks/pr-workflow-gate.d.ts +20 -0
  77. package/dist/index.js +775 -748
  78. package/dist/plan/ledger.d.ts +55 -0
  79. package/dist/plan/manager.d.ts +9 -0
  80. package/dist/plan/planning-profile.d.ts +27 -0
  81. package/dist/services/spec-drift-recovery.d.ts +84 -0
  82. package/dist/session/snapshot-writer.d.ts +3 -1
  83. package/dist/state.d.ts +19 -17
  84. package/dist/summaries/schema.d.ts +2 -2
  85. package/dist/tools/convene-council.d.ts +6 -6
  86. package/dist/tools/save-plan.d.ts +8 -0
  87. package/dist/tools/submit-phase-council-verdicts.d.ts +6 -6
  88. package/dist/tools/tool-metadata.d.ts +28 -28
  89. package/dist/tools/update-task-status.d.ts +13 -0
  90. package/dist/tools/write-final-council-evidence.d.ts +6 -6
  91. package/dist/types/events.d.ts +29 -1
  92. package/dist/workflow/coder-settlement.d.ts +62 -0
  93. package/dist/workflow/task-repair.d.ts +30 -0
  94. package/dist/workflow/task-terminal.d.ts +52 -0
  95. package/package.json +1 -1
  96. package/dist/cli/curator-llm-factory-cfm8fhdw.js +0 -61
  97. package/dist/cli/gate-evidence-ezxfkb22.js +0 -32
  98. package/dist/cli/guardrail-explain-pn1bcgfz.js +0 -62
  99. package/dist/cli/index-d181x9zr.js +0 -71
  100. package/dist/cli/index-dtyeabmj.js +0 -239
@@ -11,16 +11,41 @@ This protocol is loaded on demand by the architect runtime. The architect prompt
11
11
 
12
12
  ### MODE: PLAN
13
13
 
14
- SPEC GATE (soft check before planning):
14
+ PLANNING PROFILE (authoritative): obey the runtime-injected `[PLANNING PROFILE
15
+ — AUTHORITATIVE]` directive, which is produced by the same resolver used by
16
+ `save_plan`. Select exactly one path:
17
+
18
+ - `balanced`: use durable QA/execution defaults and do not pause for the full
19
+ questionnaire, spec ceremony, or complete clarification funnel. Ask only for
20
+ unresolved material ambiguity, destructive/high-risk authorization, or a
21
+ decision only the user can make. `save_plan` exact-binds the default QA
22
+ profile. Persist `planning_profile: "balanced"`.
23
+ - `strict` (including locked legacy profiles with no stored field): require an
24
+ effective spec, run the complete clarification funnel, present the unified
25
+ QA/execution questionnaire, and wait for the user's answers before saving.
26
+ Persist `planning_profile: "strict"` only when the field is already explicit
27
+ or this is a new/unlocked plan; do not materialize it into a locked legacy
28
+ profile.
29
+
30
+ A locked profile may ratchet `balanced` to `strict`; it never moves `strict` to
31
+ `balanced`.
32
+
33
+ SPEC POLICY (profile-dependent — check before planning):
15
34
 
16
35
  An effective spec exists iff `/swarm sdd status` reports a resolved spec (it reflects `readEffectiveSpecSync`, which returns null for no sources, multiple competing sources, multi-feature Spec-Kit without a selected feature, or any unresolvable state). Do NOT enumerate these cases — defer to `/swarm sdd status`.
17
36
 
18
37
  - If NO effective spec exists (confirmed via `/swarm sdd status`):
38
+ - `strict`: stop and enter MODE: SPECIFY (or materialize a selected SDD source
39
+ with explicit consent). Strict planning cannot save without an effective
40
+ spec.
41
+ - `balanced`: a spec is optional. Offer the choices below only when a spec
42
+ would materially resolve ambiguity; otherwise proceed directly.
43
+ - The remaining no-spec choices in this section apply only to `balanced`.
19
44
  - PLAN INGESTION DETECTION: Check if the user is providing an external plan (indicators: markdown content with Phase/Task structure, or phrases like "ingest this plan", "implement this plan", "prepare for implementation", "here is a plan", "here's the plan"):
20
45
  - If plan ingestion is detected AND no effective spec exists: offer this choice FIRST before any planning:
21
46
  1. "Generate spec from this plan first" → enter EXTERNAL PLAN IMPORT PATH in MODE: SPECIFY to reverse-engineer a spec.md from the provided plan, then return to planning
22
47
  2. "Skip spec and proceed with the provided plan" → proceed directly to plan ingestion and planning without creating a spec
23
- - This is a SOFT gate — option 2 always lets the user proceed without a spec
48
+ - In `balanced`, this is a SOFT gate — option 2 lets the user proceed without a spec.
24
49
  - If no plan ingestion detected: Warn: "No effective spec found. A spec helps ensure the plan covers all requirements and gives the critic something to verify against. Would you like to create one first?"
25
50
  - Offer two options:
26
51
  1. "Create a spec first" → transition to MODE: SPECIFY
@@ -28,20 +53,21 @@ An effective spec exists iff `/swarm sdd status` reports a resolved spec (it ref
28
53
  - If an effective spec EXISTS:
29
54
  - NOTE: Stale detection is intentionally heuristic (compare headings) — false positives are acceptable because this is a SOFT gate. When in doubt, ask the user.
30
55
  - Read the spec (using the effective spec path reported by `/swarm sdd status`) and compare its first heading (or feature description) against the current planning context (the user's request and any existing plan.md title/phase names)
31
- - STALE SPEC DETECTION: If the spec heading or feature description does NOT match the current work being planned (e.g., spec describes "user authentication" but user is asking to plan "payment integration"), treat the spec as potentially stale and offer three options:
56
+ - STALE SPEC DETECTION: If the spec heading or feature description does NOT match the current work being planned (e.g., spec describes "user authentication" but user is asking to plan "payment integration"), treat the spec as potentially stale. In `strict`, offer options 1 and 2 only. In `balanced`, offer all three options:
32
57
  1. **Archive and create new spec** → attempt to rename .swarm/spec.md to .swarm/spec-archive/spec-{YYYY-MM-DD}.md (create the directory if needed); if archival succeeds: enter MODE: SPECIFY and skip the "spec already exists" prompt; if archival fails: inform user of the failure and offer: retry archival, or proceed with option 2, or proceed with option 3
33
58
  2. **Keep existing spec** → use the effective spec as-is and proceed with planning below
34
- 3. **Skip spec entirely** → proceed to planning below ignoring the existing spec
59
+ 3. **Skip spec entirely** (`balanced` only) → proceed to planning below ignoring the existing spec
35
60
  - If the spec appears current (heading matches the work being planned) OR user chose option 2 above, proceed with spec:
36
61
  - Read it and use it as the primary input for planning
37
62
  - Cross-reference requirements (FR-###) when decomposing tasks
38
63
  - Ensure every FR-### maps to at least one task
39
64
  - If a task has no corresponding FR-###, flag it as a potential gold-plating risk
40
- - If user chose option 3 above, proceed without spec: skip all spec-based steps and proceed directly to planning
65
+ - If a `balanced` user chose option 3 above, proceed without spec: skip all spec-based steps and proceed directly to planning
41
66
 
42
- This is a SOFT gate. When the user chooses "Skip and plan directly", proceed to the steps below exactly as before — do NOT modify any planning behavior.
67
+ This is a soft gate only in `balanced`. In `strict`, a missing effective spec is
68
+ a hard prerequisite and `save_plan` will return `SPEC_REQUIRED`.
43
69
 
44
- **SAVE_PLAN SPEC_REQUIRED RECOVERY:**
70
+ **STRICT-ONLY SAVE_PLAN SPEC_REQUIRED RECOVERY:**
45
71
  When `save_plan` returns a SPEC_REQUIRED rejection (no effective spec found), the architect MUST:
46
72
  1. DIAGNOSE: run `/swarm sdd status` to determine why no effective spec resolved.
47
73
  - (a) If `/swarm sdd status` shows NO sources → transition to MODE: SPECIFY.
@@ -54,7 +80,7 @@ Run CODEBASE REALITY CHECK scoped to codebase elements referenced in the effecti
54
80
 
55
81
  ### GENERAL COUNCIL ADVISORY OPTION (pre-save_plan)
56
82
 
57
- Before drafting or saving the plan, the architect MUST offer General Council advisory input when `council.general.enabled` is true in the resolved opencode-swarm config and a search API key is configured.
83
+ In `strict`, before drafting or saving the plan, the architect MUST offer General Council advisory input when `council.general.enabled` is true in the resolved opencode-swarm config and a search API key is configured. In `balanced`, offer it only when current external facts could materially change the plan; do not introduce a pause merely because the feature is configured.
58
84
 
59
85
  - Ask the user: "Use General Council advisory input before I write the plan? The 3-agent council (generalist, skeptic, domain expert) will gather current external context and provide perspectives that I will fold into the plan before critic review. (default: no)"
60
86
  - If the user declines, proceed to the clarification funnel and planning normally.
@@ -70,7 +96,7 @@ General Council is advisory and distinct from `council_mode`, `phase_council`, a
70
96
 
71
97
  ### CLARIFICATION FUNNEL (pre-save_plan)
72
98
 
73
- Before calling `save_plan` — whether creating a new plan or finalizing an external plan ingestion — the architect MUST run this four-stage clarification funnel. The goal is to limit unnecessary user interruption, not planning completeness.
99
+ In `strict`, before calling `save_plan` — whether creating a new plan or finalizing an external plan ingestion — the architect MUST run this four-stage clarification funnel. In `balanced`, use the same classification concepts internally but surface only unresolved material ambiguity, destructive/high-risk authorization, or decisions only the user can make; do not run the full funnel as ceremony.
74
100
 
75
101
  #### Stage 1: Inventory All Material Uncertainties
76
102
 
@@ -113,6 +139,8 @@ For each item classified as `research_needed` or `user_decision` in Stage 2, sen
113
139
 
114
140
  **Hard constraint:** Items in the Always-Surface Categories list (below) MUST NOT receive `UNNECESSARY`/`DROP` from the critic — only `REPHRASE` or `APPROVED`/`ASK_USER` are allowed. If the critic attempts to `UNNECESSARY`/`DROP` an always-surface item, override to `APPROVED`/`ASK_USER`.
115
141
 
142
+ This always-surface protection remains mandatory in every planning profile.
143
+
116
144
  **Overconfidence guard:** If the critic attempts to self-resolve an item by supplying an answer (verdict `RESOLVE`) but the underlying default is not directly supported by user request, spec, or recorded context, the architect MUST classify the item as `user_decision` rather than `self_resolved`. Unsupported defaults must not be silently accepted.
117
145
 
118
146
  Update classifications based on critic response:
@@ -124,7 +152,7 @@ Update classifications based on critic response:
124
152
 
125
153
  The architect MUST update the plan's assumptions with all resolved items before proceeding to Stage 4.
126
154
 
127
- Exception: QA gate selection questions are already mandatory user decisions (enforced by the save_plan tool itself) and do NOT need to go through the funnel. QA gate selection is always a direct user dialogue.
155
+ Strict-only exception: QA gate selection questions are direct user decisions and do NOT need to go through the funnel. Balanced uses the durable default profile and does not present this dialogue.
128
156
 
129
157
  #### Stage 4: Surface User Decision Packet
130
158
 
@@ -182,7 +210,7 @@ Draft the complete implementation plan in memory first. Required parameters:
182
210
 
183
211
  1. Finish drafting the title, swarm identifier, phases, tasks, dependencies, and `files_touched` scopes. Freeze the exact raw plan identity as `swarm_id` plus `plan_title` (the same title passed to `save_plan`). Do not normalize, shorten, or rename either value between profile creation and plan save. An intentional identity replacement must use `confirm_identity_change: true`; never silently create a second profile because wording changed.
184
212
  2. Inspect dependency-ready tasks and their file scopes before recommending parallelism. File-disjoint task groups may run concurrently in isolated worktrees; overlapping or unknown scopes require serial execution.
185
- 3. Present the following unified four-choice dialogue in one message and wait for one complete answer. Silence is not consent.
213
+ 3. `strict`: present the following unified four-choice dialogue in one message and wait for one complete answer. Silence is not consent. `balanced`: skip this dialogue and continue with the durable defaults.
186
214
 
187
215
  <!-- BEGIN QA_GATE_BODY -->
188
216
 
@@ -208,7 +236,7 @@ Additionally, present these three sub-items as part of the same exchange:
208
236
  <!-- END QA_GATE_BODY -->
209
237
 
210
238
  4. MODE: LOOP exception: when `autonomy=auto`, do not pause. Use the loop skill's balanced-speed defaults: reviewer, test_engineer, sme_enabled, critic_pre_plan, sast_enabled, and drift_check ON; council_mode, hallucination_guard, mutation_test, phase_council, and final_council OFF. Choose the largest safe parallel count from the drafted scopes (1 when overlap or uncertainty exists), keep phase-level commits (`commit_after_each_completed_task: false`), and set `auto_proceed: true`.
211
- 5. Before the first `save_plan`, persist all eleven gate booleans with `set_qa_gates({ swarm_id: <exact swarm_id>, plan_title: <exact title>, ...gates })`. If it fails, stop and resolve the profile error; do not save a plan without the matching profile.
239
+ 5. `strict`: before the first `save_plan`, persist all eleven gate booleans with `set_qa_gates({ swarm_id: <exact swarm_id>, plan_title: <exact title>, ...gates })`. If it fails, stop and resolve the profile error. `balanced`: do not call `set_qa_gates` merely to reproduce defaults; `save_plan` creates and exact-binds them.
212
240
  Recovery for upgraded legacy plans: if `get_qa_gate_profile`, `save_plan`, or an execution gate reports that the QA profile is not exact-bound, run `set_qa_gates({ swarm_id: <exact swarm_id>, plan_title: <exact title>, adopt_legacy_binding_only: true })`. This exact-binds the existing profile without changing gates or its lock, then you retry the blocked read/save/enforcement step.
213
241
  6. Immediately call `save_plan` with the same exact identity, the full drafted phases, and the complete locked profile:
214
242
 
@@ -947,7 +947,7 @@ build a minimal correct single-lane reproduction using the same workflow mode,
947
947
  lane identity, exact head, and canonical row. Before retrying, distinguish the
948
948
  three independent input layers: the header schema, data-row values, and tool
949
949
  argument shape. A correct header does not repair an invalid severity or lane
950
- value, and correct row data does not repair malformed dispatch JSON.
950
+ value, and correct row data does not repair malformed dispatch JSON. Benign shape defects (evidence pipes, marker rows, verdict-row pipes) are auto-repaired and recorded as salvage — never a retry reason alone (contract and fidelity boundaries: `references/lane-output-recoverability.md`).
951
951
 
952
952
  Classify the incident from actual user-visible harm and the first failed
953
953
  predicate, not from the number of retries or the eventual result. A successful
@@ -1157,9 +1157,7 @@ pass the exact reviewed merge-base as `base_sha`, the exact live base branch
1157
1157
  tip/ref used to compute it as `base_ref`, and the same `pr_head_sha` to the
1158
1158
  writer. The writer runs bounded `git merge-base -- <base_ref> <pr_head_sha>` and
1159
1159
  rejects any claimed `base_sha` that is not the exact result. It accepts only an
1160
- exact eleven-row v2 receipt: `MATCHED` rows are backed by completed,
1161
- non-degraded, exact-head artifacts from lanes that declared and attested their
1162
- families; `NOT_TRIGGERED` rows are provenance-free. Counts are recomputed and
1160
+ exact eleven-row v2 receipt backed by verifiable provenance (identity, ownership, digest, retained artifact); a coverage-QUALITY failure is disclosed on the receipt as `coverage_degradations` and the run proceeds, with synthesis disclosing degraded families (`references/lane-output-recoverability.md`). `NOT_TRIGGERED` rows are provenance-free. Counts are recomputed and
1163
1161
  must agree. It never uses keyword or path classification alone as absence
1164
1162
  evidence. Any head mismatch makes persistence fail. Historical unversioned and
1165
1163
  schema-v1 all-`MATCHED` receipts remain readable, but new writes are strict v2.
@@ -0,0 +1,54 @@
1
+ # Lane-output recoverability (repairs and recorded degradation)
2
+
3
+ Supplement to the main `SKILL.md` (progressive disclosure per the issue #2131
4
+ criterion-G ratchet). This file documents the recoverability contract added to
5
+ keep substantively-correct but format-imperfect runs completable.
6
+
7
+ ## Parser-boundary repairs (recorded as salvage)
8
+
9
+ Two benign shape defects are repaired automatically at the parser boundary and
10
+ are never a reason to retry by themselves:
11
+
12
+ - **`clean-evidence-pipe-tail-merge`** — literal unescaped pipes inside a
13
+ `[CLEAN]` row's evidence text (regex character classes like `,;|`, shell
14
+ snippets) are tail-merged into the evidence field instead of splitting the
15
+ row past the 4-field contract. Deterministic: evidence is the trailing field.
16
+ - **`summary-row-dropped`** — pipe-bearing non-contract marker rows
17
+ (`[LANE_SUMMARY]`, `[NOTE]`, `[DONE]`, …) are dropped before parsing; they
18
+ were previously miscounted as malformed candidate rows that voided an
19
+ otherwise-valid clean attestation. Pipe-free lines are preserved (they may be
20
+ continuation fragments).
21
+
22
+ Both repairs are recorded as salvage on the lane record. Lanes should still
23
+ escape pipes as `\|` where practical, but the review no longer fails when they
24
+ do not. The per-obligation CLEAN rules: a `[CLEAN]` conflicts with `[CANDIDATE]`
25
+ rows only for the SAME lane; a valid CLEAN for a different lane in an unscoped
26
+ parse is skipped, not an error; duplicates for the same lane still fail.
27
+
28
+ ## Verdict-row pipe tolerance and its fidelity boundary
29
+
30
+ `[REVIEWED]` (10-field), `[CRITIC]` (6-field), and `[FEEDBACK-VERIFIED]`
31
+ (4-field) rows tail-merge extra pipe separators into the trailing free-text
32
+ field. Fidelity boundary: content-preserving when the extra pipes sit in the
33
+ trailing field; a pipe in a mid-row prose field still authenticates (all
34
+ machine-checked positions are untouched) but trailing prose fields may be
35
+ re-arranged. A debug-gated warn fires on every applied merge; the raw lane
36
+ emission is always retained verbatim in the lane-output store, so repairs are
37
+ re-derivable.
38
+
39
+ ## Recorded coverage degradation (trigger evaluation)
40
+
41
+ The trigger-eval writer accepts only an exact eleven-row v2 receipt whose
42
+ `MATCHED` rows are backed by exact-head artifacts from lanes that declared
43
+ ownership of their families through a verifiable provenance chain (identity,
44
+ ownership, digest, retained artifact). A lane whose coverage QUALITY is
45
+ imperfect — it ended `error`/`cancelled` after exhausting retries, or its
46
+ artifact has no covered `[CANDIDATE]`/`[CLEAN]` row for the row's own family —
47
+ no longer dead-ends the run: the writer records the failure on the durable
48
+ receipt as a `coverage_degradations` entry (trigger id, source lane, reason,
49
+ row-scoped so a consolidated lane's covered families are never misattributed)
50
+ and proceeds. The tool result reports `coverage_degradation_count`; the
51
+ synthesis phase MUST disclose every degraded family, with its recorded reason,
52
+ in the final review report. Retries remain the first resort (COVERAGE GATE); a
53
+ missing provenance chain still fails closed, and the reviewer/critic inventory
54
+ skips exactly the receipt-disclosed dispatch tuples.
@@ -1,5 +1,6 @@
1
1
  import type { AgentConfig } from '@opencode-ai/sdk';
2
2
  export type { AgentConfig };
3
+ import { type ResolvedPlanningProfile } from '../plan/planning-profile';
3
4
  export interface AgentDefinition {
4
5
  name: string;
5
6
  description?: string;
@@ -72,4 +73,4 @@ export declare function buildCouncilWorkflow(council?: CouncilWorkflowConfig): s
72
73
  * helper remains as a compatibility oracle for direct prompt-contract tests.
73
74
  */
74
75
  export declare function buildQaGateSelectionDialogue(modeLabel: 'BRAINSTORM' | 'SPECIFY' | 'PLAN'): string;
75
- export declare function createArchitectAgent(model: string, customPrompt?: string, customAppendPrompt?: string, adversarialTesting?: AdversarialTestingConfig, council?: CouncilWorkflowConfig, uiReview?: UIReviewConfig, memoryEnabled?: boolean, architecturalSupervision?: ArchitectureSupervisionWorkflowConfig, designDocsEnabled?: boolean, externalSkillsEnabled?: boolean, turboEnabled?: boolean, skillsEnabled?: boolean): AgentDefinition;
76
+ export declare function createArchitectAgent(model: string, customPrompt?: string, customAppendPrompt?: string, adversarialTesting?: AdversarialTestingConfig, council?: CouncilWorkflowConfig, uiReview?: UIReviewConfig, memoryEnabled?: boolean, architecturalSupervision?: ArchitectureSupervisionWorkflowConfig, designDocsEnabled?: boolean, externalSkillsEnabled?: boolean, turboEnabled?: boolean, skillsEnabled?: boolean, planningProfileResolution?: ResolvedPlanningProfile): AgentDefinition;
@@ -51,7 +51,7 @@ export interface NormalizedCandidateArtifact {
51
51
  /** Narrow, auditable repairs applied before the unchanged strict parser runs. */
52
52
  repairKinds: CandidateArtifactRepairKind[];
53
53
  }
54
- export type CandidateArtifactRepairKind = 'synthesized-header' | 'terminal-protocol-fence' | 'redundant-clean-confidence';
54
+ export type CandidateArtifactRepairKind = 'synthesized-header' | 'terminal-protocol-fence' | 'redundant-clean-confidence' | 'clean-evidence-pipe-tail-merge' | 'summary-row-dropped';
55
55
  /**
56
56
  * Normalize a lane artifact ONCE so every consumer parses byte-identical text.
57
57
  *
@@ -81,6 +81,8 @@ export interface BackgroundDelegationRecord {
81
81
  workspace?: BackgroundWorkspaceSnapshot;
82
82
  /** Immutable pre-coder provenance for doc-only gate classification. */
83
83
  taskChangeContext?: BackgroundTaskChangeContext;
84
+ /** Exact-task workflow generation captured before a Stage B dispatch. */
85
+ workflowGeneration?: number;
84
86
  /** Complete isolated-worktree recovery coordinates captured before handoff. */
85
87
  worktree?: BackgroundWorktreeDescriptor;
86
88
  /** Stable pre-launch background-coder capacity reservation. */
@@ -109,6 +111,8 @@ export interface BackgroundWorkspaceSnapshot {
109
111
  export interface BackgroundTaskChangeContext {
110
112
  declaredFiles: string[] | null;
111
113
  baseline: BackgroundWorkspaceSnapshot;
114
+ /** Exact-task workflow generation captured before coder dispatch. */
115
+ workflowGeneration?: number;
112
116
  }
113
117
  export interface BackgroundWorktreeDescriptor {
114
118
  callID: string;
@@ -250,6 +254,7 @@ export interface RecordPendingInput {
250
254
  promptHash?: string;
251
255
  workspace?: BackgroundWorkspaceSnapshot;
252
256
  taskChangeContext?: BackgroundTaskChangeContext;
257
+ workflowGeneration?: number;
253
258
  worktree?: BackgroundWorktreeDescriptor;
254
259
  coderReservationId?: string;
255
260
  prompt?: BackgroundPromptSnapshot;
@@ -171,6 +171,32 @@ interface ValidatedTriggerLedger<TRow> {
171
171
  export declare function validatePrReviewInlineTriggerLedger(input: unknown): ValidatedTriggerLedger<PrReviewInlineTriggerRow>;
172
172
  export declare function validatePrReviewPersistedInputLedger(input: unknown): ValidatedTriggerLedger<PrReviewPersistedInputRow>;
173
173
  export declare function validatePrReviewWriterInputLedger(input: unknown): ValidatedTriggerLedger<PrReviewWriterInputRow>;
174
+ /**
175
+ * Disclosure record for a MATCHED family whose cited micro lane could not
176
+ * produce a non-degraded, fully-covering artifact after retries. The run
177
+ * proceeds; the receipt — and therefore every consumer of it — can see exactly
178
+ * which families are degraded and why. Provenance (identity, ownership, exact
179
+ * head) is still enforced for these rows; only coverage QUALITY is relaxed.
180
+ */
181
+ export declare const TriggerCoverageDegradationSchema: z.ZodObject<{
182
+ trigger_id: z.ZodEnum<{
183
+ "auth-identity-secrets": "auth-identity-secrets";
184
+ "untrusted-input-boundaries": "untrusted-input-boundaries";
185
+ "subprocess-platform": "subprocess-platform";
186
+ "concurrency-state": "concurrency-state";
187
+ "dependencies-build-release": "dependencies-build-release";
188
+ "api-schema-migrations": "api-schema-migrations";
189
+ "test-infrastructure": "test-infrastructure";
190
+ "ui-accessibility-i18n": "ui-accessibility-i18n";
191
+ "privacy-observability": "privacy-observability";
192
+ "generated-provenance": "generated-provenance";
193
+ "unclassified-risk": "unclassified-risk";
194
+ }>;
195
+ source_batch_id: z.ZodString;
196
+ source_lane_id: z.ZodString;
197
+ reason: z.ZodString;
198
+ }, z.core.$strict>;
199
+ export type TriggerCoverageDegradation = z.infer<typeof TriggerCoverageDegradationSchema>;
174
200
  export interface BuildPrReviewTriggerReceiptV2Args {
175
201
  run_id: string;
176
202
  pr_head_sha: string;
@@ -179,6 +205,8 @@ export interface BuildPrReviewTriggerReceiptV2Args {
179
205
  evaluated_at: string;
180
206
  dispatched_micro_lane_count: number;
181
207
  rows: unknown;
208
+ /** Receipt-level degradation disclosure; ledger rows stay untouched so the frozen-ledger digest is unaffected. */
209
+ coverage_degradations?: TriggerCoverageDegradation[];
182
210
  }
183
211
  export declare function buildPrReviewTriggerReceiptV2(input: BuildPrReviewTriggerReceiptV2Args): {
184
212
  run_id: string;
@@ -209,6 +237,12 @@ export declare function buildPrReviewTriggerReceiptV2(input: BuildPrReviewTrigge
209
237
  micro_lane: string;
210
238
  trigger_id: "auth-identity-secrets" | "untrusted-input-boundaries" | "subprocess-platform" | "concurrency-state" | "dependencies-build-release" | "api-schema-migrations" | "test-infrastructure" | "ui-accessibility-i18n" | "privacy-observability" | "generated-provenance" | "unclassified-risk";
211
239
  })[];
240
+ coverage_degradations: {
241
+ trigger_id: "auth-identity-secrets" | "untrusted-input-boundaries" | "subprocess-platform" | "concurrency-state" | "dependencies-build-release" | "api-schema-migrations" | "test-infrastructure" | "ui-accessibility-i18n" | "privacy-observability" | "generated-provenance" | "unclassified-risk";
242
+ source_batch_id: string;
243
+ source_lane_id: string;
244
+ reason: string;
245
+ }[];
212
246
  };
213
247
  export interface ParsedPrReviewTriggerReceipt {
214
248
  schemaVersion: 0 | 1 | 2;
@@ -219,6 +253,8 @@ export interface ParsedPrReviewTriggerReceipt {
219
253
  notTriggeredRows: Extract<PrReviewPersistedInputRow, {
220
254
  result: 'NOT_TRIGGERED';
221
255
  }>[];
256
+ /** Empty for pre-v2.2 receipts. Present entries mean the family's cited lane is provenance-valid but coverage-degraded. */
257
+ coverageDegradations: TriggerCoverageDegradation[];
222
258
  }
223
259
  /**
224
260
  * Bind every micro dispatch to one semantic ledger at bind time.
@@ -12,11 +12,11 @@ import {
12
12
  shouldRunOnStartup,
13
13
  writeBackupArtifact,
14
14
  writeDoctorArtifact
15
- } from "./index-arza4m4j.js";
15
+ } from "./index-p2ty3eee.js";
16
16
  import"./index-ee3x66a5.js";
17
17
  import"./index-zgwm4ryv.js";
18
- import"./index-tj04dj06.js";
19
- import"./index-hxvkfx6t.js";
18
+ import"./index-thp186x0.js";
19
+ import"./index-jqsfsqbx.js";
20
20
  import"./index-zjygnfay.js";
21
21
  import"./index-bk5tah7q.js";
22
22
  import"./index-bpmtbmy9.js";
@@ -14,12 +14,12 @@ import {
14
14
  resolveWorktreeBaseDir,
15
15
  shortenWorktreePath,
16
16
  writeLaneProfileToDiskReal
17
- } from "./index-v3x7j9ey.js";
17
+ } from "./index-dtqjxfw9.js";
18
18
  import"./index-ee3x66a5.js";
19
19
  import"./index-4nt52yr9.js";
20
20
  import"./index-4rhhvd1a.js";
21
21
  import"./index-zgwm4ryv.js";
22
- import"./index-hxvkfx6t.js";
22
+ import"./index-jqsfsqbx.js";
23
23
  import"./index-zjygnfay.js";
24
24
  import"./index-a76rekgs.js";
25
25
  export {
@@ -4,16 +4,16 @@ import {
4
4
  authorizeCuration,
5
5
  buildConfigFingerprintInput,
6
6
  readCohortConfigFingerprint
7
- } from "./index-dtam929z.js";
7
+ } from "./index-qy1nq52t.js";
8
8
  import"./index-rtry5xyf.js";
9
- import"./index-mrpfd1jx.js";
10
- import"./index-4hp8nvwb.js";
11
- import"./index-ed5ykebp.js";
12
- import"./index-35qep0v7.js";
9
+ import"./index-vh05t3w5.js";
10
+ import"./index-p8kk34am.js";
11
+ import"./index-912qz4y0.js";
13
12
  import"./index-7g4c7s5r.js";
13
+ import"./index-ed5ykebp.js";
14
14
  import"./index-4nt52yr9.js";
15
15
  import"./index-zgwm4ryv.js";
16
- import"./index-bfhwtdsw.js";
16
+ import"./index-epvhf50h.js";
17
17
  import"./index-bpmtbmy9.js";
18
18
  import"./index-a76rekgs.js";
19
19
  export {
@@ -0,0 +1,61 @@
1
+ // @bun
2
+ import {
3
+ createCuratorLLMDelegate
4
+ } from "./index-nakkgkkt.js";
5
+ import"./index-4905hd2m.js";
6
+ import"./index-41hkt36g.js";
7
+ import"./index-c432knmy.js";
8
+ import"./index-1p72dtym.js";
9
+ import"./index-c8s9a3zh.js";
10
+ import"./index-p2ty3eee.js";
11
+ import"./index-56rqw2hs.js";
12
+ import"./index-134d35c1.js";
13
+ import"./index-t5pytnca.js";
14
+ import"./index-y8552snf.js";
15
+ import"./index-9ss2m4rs.js";
16
+ import"./index-74hpm6sh.js";
17
+ import"./index-z3s0a44b.js";
18
+ import"./index-z0z9pe7b.js";
19
+ import"./index-h01wb18g.js";
20
+ import"./index-v2xrer41.js";
21
+ import"./index-m9xrdjn0.js";
22
+ import"./index-bjqpdr83.js";
23
+ import"./index-556ja8an.js";
24
+ import"./index-4zxrkk1h.js";
25
+ import"./index-zsrtt42s.js";
26
+ import"./index-dtqjxfw9.js";
27
+ import"./index-qwm6vdyv.js";
28
+ import"./index-tjqzr3jc.js";
29
+ import"./index-s1v0wza5.js";
30
+ import"./index-8fwhhayc.js";
31
+ import"./index-q1exe2b3.js";
32
+ import"./index-92n3d5ky.js";
33
+ import"./index-k46me75h.js";
34
+ import"./index-ee3x66a5.js";
35
+ import"./index-y9q9f6ms.js";
36
+ import"./index-qy1nq52t.js";
37
+ import"./index-rtry5xyf.js";
38
+ import"./index-fejfzy2j.js";
39
+ import"./index-ae75rja9.js";
40
+ import"./index-vh05t3w5.js";
41
+ import"./index-p8kk34am.js";
42
+ import"./index-912qz4y0.js";
43
+ import"./index-7g4c7s5r.js";
44
+ import"./index-ed5ykebp.js";
45
+ import"./index-4nt52yr9.js";
46
+ import"./index-p04qrwck.js";
47
+ import"./index-gprxjmm7.js";
48
+ import"./index-n832052r.js";
49
+ import"./index-zd4qhnr7.js";
50
+ import"./index-4rhhvd1a.js";
51
+ import"./index-zgwm4ryv.js";
52
+ import"./index-thp186x0.js";
53
+ import"./index-jqsfsqbx.js";
54
+ import"./index-zjygnfay.js";
55
+ import"./index-bk5tah7q.js";
56
+ import"./index-epvhf50h.js";
57
+ import"./index-bpmtbmy9.js";
58
+ import"./index-a76rekgs.js";
59
+ export {
60
+ createCuratorLLMDelegate
61
+ };
@@ -1,6 +1,6 @@
1
1
  // @bun
2
2
  import {
3
- _internals,
3
+ _internals1 as _internals,
4
4
  appendCuratorRecommendation,
5
5
  applyCuratorKnowledgeUpdates,
6
6
  checkPhaseCompliance,
@@ -14,59 +14,59 @@ import {
14
14
  runCuratorInit,
15
15
  runCuratorPhase,
16
16
  writeCuratorSummary
17
- } from "./index-a1fjhx4w.js";
18
- import"./index-41hkt36g.js";
19
- import"./index-c5kr20nz.js";
20
- import"./index-ysa38bnr.js";
21
- import"./index-arza4m4j.js";
22
- import"./index-hz0refz4.js";
23
- import"./index-w4etfamq.js";
24
- import"./index-y8552snf.js";
17
+ } from "./index-nakkgkkt.js";
25
18
  import"./index-4905hd2m.js";
26
- import"./index-134d35c1.js";
27
- import"./index-hfjvepk2.js";
28
- import"./index-v1an91bq.js";
29
- import"./index-mpytsq6k.js";
30
- import"./index-v2xrer41.js";
19
+ import"./index-41hkt36g.js";
20
+ import"./index-c432knmy.js";
21
+ import"./index-1p72dtym.js";
31
22
  import"./index-c8s9a3zh.js";
23
+ import"./index-p2ty3eee.js";
24
+ import"./index-56rqw2hs.js";
25
+ import"./index-134d35c1.js";
26
+ import"./index-t5pytnca.js";
27
+ import"./index-y8552snf.js";
32
28
  import"./index-9ss2m4rs.js";
33
- import"./index-bn17ycxn.js";
34
- import"./index-ryq97w1x.js";
35
- import"./index-556ja8an.js";
36
- import"./index-wk8s1m7b.js";
37
- import"./index-1kyex7z2.js";
38
- import"./index-b8zgtz81.js";
39
- import"./index-v3x7j9ey.js";
40
- import"./index-rrb6cz2f.js";
41
29
  import"./index-74hpm6sh.js";
42
- import"./index-dtyeabmj.js";
30
+ import"./index-z3s0a44b.js";
31
+ import"./index-z0z9pe7b.js";
32
+ import"./index-h01wb18g.js";
33
+ import"./index-v2xrer41.js";
34
+ import"./index-m9xrdjn0.js";
35
+ import"./index-bjqpdr83.js";
36
+ import"./index-556ja8an.js";
37
+ import"./index-4zxrkk1h.js";
38
+ import"./index-zsrtt42s.js";
39
+ import"./index-dtqjxfw9.js";
40
+ import"./index-qwm6vdyv.js";
41
+ import"./index-tjqzr3jc.js";
42
+ import"./index-s1v0wza5.js";
43
43
  import"./index-8fwhhayc.js";
44
44
  import"./index-q1exe2b3.js";
45
- import"./index-2rb3x0fk.js";
45
+ import"./index-92n3d5ky.js";
46
46
  import"./index-k46me75h.js";
47
47
  import"./index-ee3x66a5.js";
48
- import"./index-7begd9aq.js";
49
- import"./index-dtam929z.js";
48
+ import"./index-y9q9f6ms.js";
49
+ import"./index-qy1nq52t.js";
50
50
  import"./index-rtry5xyf.js";
51
- import"./index-vrmkg8fm.js";
51
+ import"./index-fejfzy2j.js";
52
52
  import"./index-ae75rja9.js";
53
- import"./index-mrpfd1jx.js";
54
- import"./index-4hp8nvwb.js";
55
- import"./index-ed5ykebp.js";
56
- import"./index-35qep0v7.js";
53
+ import"./index-vh05t3w5.js";
54
+ import"./index-p8kk34am.js";
55
+ import"./index-912qz4y0.js";
57
56
  import"./index-7g4c7s5r.js";
57
+ import"./index-ed5ykebp.js";
58
58
  import"./index-4nt52yr9.js";
59
- import"./index-pp5m7xga.js";
59
+ import"./index-p04qrwck.js";
60
60
  import"./index-gprxjmm7.js";
61
61
  import"./index-n832052r.js";
62
- import"./index-d181x9zr.js";
62
+ import"./index-zd4qhnr7.js";
63
63
  import"./index-4rhhvd1a.js";
64
64
  import"./index-zgwm4ryv.js";
65
- import"./index-tj04dj06.js";
66
- import"./index-hxvkfx6t.js";
65
+ import"./index-thp186x0.js";
66
+ import"./index-jqsfsqbx.js";
67
67
  import"./index-zjygnfay.js";
68
68
  import"./index-bk5tah7q.js";
69
- import"./index-bfhwtdsw.js";
69
+ import"./index-epvhf50h.js";
70
70
  import"./index-bpmtbmy9.js";
71
71
  import"./index-a76rekgs.js";
72
72
  export {
@@ -6,31 +6,34 @@ import {
6
6
  loadPlanJsonOnly,
7
7
  mergeDurableGateEntriesFromEvidence,
8
8
  readDurableGateEvidence
9
- } from "./index-hz0refz4.js";
10
- import"./index-w4etfamq.js";
11
- import"./index-y8552snf.js";
9
+ } from "./index-56rqw2hs.js";
12
10
  import"./index-134d35c1.js";
11
+ import"./index-t5pytnca.js";
12
+ import"./index-y8552snf.js";
13
13
  import"./index-9ss2m4rs.js";
14
- import"./index-wk8s1m7b.js";
15
- import"./index-b8zgtz81.js";
16
- import"./index-dtyeabmj.js";
14
+ import"./index-4zxrkk1h.js";
15
+ import"./index-zsrtt42s.js";
16
+ import"./index-tjqzr3jc.js";
17
17
  import"./index-q1exe2b3.js";
18
18
  import"./index-k46me75h.js";
19
19
  import"./index-ee3x66a5.js";
20
- import"./index-4hp8nvwb.js";
21
- import"./index-ed5ykebp.js";
22
- import"./index-35qep0v7.js";
20
+ import"./index-p8kk34am.js";
21
+ import"./index-912qz4y0.js";
23
22
  import"./index-7g4c7s5r.js";
23
+ import"./index-ed5ykebp.js";
24
24
  import"./index-4nt52yr9.js";
25
25
  import"./index-gprxjmm7.js";
26
26
  import"./index-n832052r.js";
27
- import"./index-d181x9zr.js";
27
+ import"./index-zd4qhnr7.js";
28
28
  import"./index-4rhhvd1a.js";
29
29
  import {
30
30
  log
31
31
  } from "./index-zgwm4ryv.js";
32
+ import"./index-thp186x0.js";
33
+ import"./index-jqsfsqbx.js";
32
34
  import"./index-zjygnfay.js";
33
- import"./index-bfhwtdsw.js";
35
+ import"./index-bk5tah7q.js";
36
+ import"./index-epvhf50h.js";
34
37
  import"./index-bpmtbmy9.js";
35
38
  import"./index-a76rekgs.js";
36
39
 
@@ -0,0 +1,51 @@
1
+ // @bun
2
+ import {
3
+ DEFAULT_REQUIRED_GATES,
4
+ TASK_WORKFLOW_SCHEMA_MARKER,
5
+ assertTaskEvidenceWriteAllowed,
6
+ compareTaskWorkflowStateRank,
7
+ deriveRequiredGates,
8
+ expandRequiredGates,
9
+ getTaskWorkflowSnapshot,
10
+ hasPassedAllGates,
11
+ isValidTaskId,
12
+ parseTaskEvidence,
13
+ readTaskEvidence,
14
+ readTaskEvidenceRaw,
15
+ recordAgentDispatch,
16
+ recordGateEvidence,
17
+ reduceTaskWorkflowSnapshot,
18
+ transitionTaskWorkflowEvidence,
19
+ withTaskEvidenceTransaction
20
+ } from "./index-tjqzr3jc.js";
21
+ import"./index-k46me75h.js";
22
+ import"./index-ee3x66a5.js";
23
+ import"./index-p8kk34am.js";
24
+ import"./index-912qz4y0.js";
25
+ import"./index-7g4c7s5r.js";
26
+ import"./index-ed5ykebp.js";
27
+ import"./index-4nt52yr9.js";
28
+ import"./index-zgwm4ryv.js";
29
+ import"./index-zjygnfay.js";
30
+ import"./index-epvhf50h.js";
31
+ import"./index-bpmtbmy9.js";
32
+ import"./index-a76rekgs.js";
33
+ export {
34
+ withTaskEvidenceTransaction,
35
+ transitionTaskWorkflowEvidence,
36
+ reduceTaskWorkflowSnapshot,
37
+ recordGateEvidence,
38
+ recordAgentDispatch,
39
+ readTaskEvidenceRaw,
40
+ readTaskEvidence,
41
+ parseTaskEvidence,
42
+ isValidTaskId,
43
+ hasPassedAllGates,
44
+ getTaskWorkflowSnapshot,
45
+ expandRequiredGates,
46
+ deriveRequiredGates,
47
+ compareTaskWorkflowStateRank,
48
+ assertTaskEvidenceWriteAllowed,
49
+ TASK_WORKFLOW_SCHEMA_MARKER,
50
+ DEFAULT_REQUIRED_GATES
51
+ };