opencode-swarm 7.185.1 → 7.186.1

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 (98) hide show
  1. package/.opencode/skills/swarm-pr-review/SKILL.md +3 -3
  2. package/.opencode/skills/swarm-pr-review/references/lane-output-recoverability.md +19 -1
  3. package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
  4. package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
  5. package/dist/background/pr-feedback-event-queue.d.ts +3 -2
  6. package/dist/background/pr-feedback-loop-runtime.d.ts +4 -1
  7. package/dist/background/pr-feedback-loop.d.ts +2 -1
  8. package/dist/background/pr-monitor-worker.d.ts +9 -1
  9. package/dist/background/pr-review-trigger-contract.d.ts +8 -0
  10. package/dist/background/pr-subscriptions.d.ts +23 -0
  11. package/dist/cli/{auto-checkpoint-2jecngee.js → auto-checkpoint-fsd4a9q9.js} +7 -7
  12. package/dist/cli/{checkpoint-qm05wdbh.js → checkpoint-rc61fd93.js} +14 -14
  13. package/dist/cli/{coder-settlement-56prayae.js → coder-settlement-x198191a.js} +10 -10
  14. package/dist/cli/{config-doctor-3b99vx74.js → config-doctor-mj4ae4jn.js} +2 -2
  15. package/dist/cli/{core-cxnqsrxp.js → core-fvsjr20m.js} +3 -3
  16. package/dist/cli/{curation-policy-ytzwb080.js → curation-policy-pxwagyh7.js} +4 -4
  17. package/dist/cli/{curator-drift-dt4g79a4.js → curator-drift-t150w08d.js} +8 -8
  18. package/dist/cli/{curator-5k3mktpe.js → curator-h7j1xse4.js} +39 -39
  19. package/dist/cli/curator-llm-factory-29cswvhr.js +81 -0
  20. package/dist/cli/{evidence-summary-service-8e2fghz0.js → evidence-summary-service-h42y6hwq.js} +17 -17
  21. package/dist/cli/{gate-evidence-vk8rebsx.js → gate-evidence-c7caa5x2.js} +5 -5
  22. package/dist/cli/guardrail-explain-yfd11za1.js +82 -0
  23. package/dist/cli/{guardrail-log-m6mydjet.js → guardrail-log-hcr5rptq.js} +6 -6
  24. package/dist/cli/{guardrail-reset-w41yndke.js → guardrail-reset-fqgf5sdb.js} +39 -39
  25. package/dist/cli/{hive-promoter-400xzdds.js → hive-promoter-632ewk29.js} +39 -39
  26. package/dist/cli/{index-9g61bfj9.js → index-010en5sq.js} +1 -1
  27. package/dist/cli/{index-r9zc92pb.js → index-03d68zxw.js} +41 -41
  28. package/dist/cli/{index-s7va6n84.js → index-0t61279z.js} +3 -3
  29. package/dist/cli/{index-zt3taseq.js → index-3rd7gqfg.js} +2 -2
  30. package/dist/cli/{index-ek5gvpvm.js → index-4h6e73bx.js} +7 -7
  31. package/dist/cli/{index-2c6e1p7j.js → index-4z0zdcd7.js} +3 -3
  32. package/dist/cli/{index-afmyp3kt.js → index-5v1sqv3m.js} +1 -1
  33. package/dist/cli/{index-6wqv8f7d.js → index-8fnayk3x.js} +5 -5
  34. package/dist/cli/{index-2b3bgm20.js → index-8jq3jsas.js} +1 -1
  35. package/dist/cli/{index-xgdypzch.js → index-92bbwjek.js} +1 -1
  36. package/dist/cli/{index-62akgg9d.js → index-92y6cpqn.js} +1 -1
  37. package/dist/cli/{index-cnbpht7m.js → index-98j268bh.js} +3 -3
  38. package/dist/cli/{index-s68z4a39.js → index-9z9g1897.js} +2 -2
  39. package/dist/cli/{index-dryhmaft.js → index-ay508kfq.js} +3 -3
  40. package/dist/cli/{index-8nsjefpc.js → index-bpqw4n2f.js} +1 -1
  41. package/dist/cli/{index-6sffjy74.js → index-c5e1wr7h.js} +1 -1
  42. package/dist/cli/{index-pa6fzbms.js → index-chaa1v0b.js} +4 -4
  43. package/dist/cli/{index-cp2nerjd.js → index-dbcwvc1v.js} +43 -20
  44. package/dist/cli/{index-hgfkcb1q.js → index-ef3pecd4.js} +813 -583
  45. package/dist/cli/{index-nw16apxs.js → index-ezttvjcf.js} +5 -5
  46. package/dist/cli/{index-m1bhg85z.js → index-gbmsvfp2.js} +2 -2
  47. package/dist/cli/{index-zxck9sr7.js → index-gjrs1epm.js} +1 -1
  48. package/dist/cli/{index-9h93zjm3.js → index-hmwnegkz.js} +1 -1
  49. package/dist/cli/{index-7jt24hpz.js → index-hq9f7fwf.js} +2 -2
  50. package/dist/cli/{index-rtznwf0g.js → index-hw8w4mkh.js} +39 -39
  51. package/dist/cli/{index-07bk0zm9.js → index-j42256hj.js} +1 -1
  52. package/dist/cli/{index-ycqsnfd1.js → index-jwkybwv0.js} +4 -4
  53. package/dist/cli/{index-yj7etak0.js → index-m8dry0a6.js} +1 -1
  54. package/dist/cli/{index-dz5cbkrm.js → index-mnb1pg1n.js} +4 -4
  55. package/dist/cli/{index-rr1dggfe.js → index-nnmgg6z6.js} +1 -1
  56. package/dist/cli/{index-7n3h39h9.js → index-pe1wgpvg.js} +7 -7
  57. package/dist/cli/{index-pppjg0ct.js → index-ptp6d5mm.js} +18 -20
  58. package/dist/cli/{index-nen885g8.js → index-q9wnbz9q.js} +1 -1
  59. package/dist/cli/{index-5n08z6qj.js → index-qg0nhcke.js} +5 -5
  60. package/dist/cli/{index-ppj5bjaq.js → index-qj7ewgrf.js} +7 -7
  61. package/dist/cli/{index-nhw5rt5x.js → index-syt8wykh.js} +4 -4
  62. package/dist/cli/{index-74yxwf8y.js → index-t46swpqf.js} +1 -1
  63. package/dist/cli/{index-ekyg4p8b.js → index-teyvb5tr.js} +1 -1
  64. package/dist/cli/{index-ss6b8jpz.js → index-vvajq163.js} +2 -2
  65. package/dist/cli/{index-1fc5aj26.js → index-w12y73z5.js} +1 -1
  66. package/dist/cli/{index-vqz0avr4.js → index-wrhf5apg.js} +2 -2
  67. package/dist/cli/{index-smwybqka.js → index-xe34ymp8.js} +2 -2
  68. package/dist/cli/{index-fa014mra.js → index-xkxt1b08.js} +3 -3
  69. package/dist/cli/{index-373880cv.js → index-y7s92gte.js} +1 -1
  70. package/dist/cli/index.js +40 -40
  71. package/dist/cli/{knowledge-escalator-30bb9fyg.js → knowledge-escalator-gajaew60.js} +11 -11
  72. package/dist/cli/{knowledge-events-gfbx97x0.js → knowledge-events-fsbgfz4z.js} +9 -9
  73. package/dist/cli/{knowledge-link-dv78fb9g.js → knowledge-link-jnnk0nmk.js} +3 -3
  74. package/dist/cli/{knowledge-store-2ssd489f.js → knowledge-store-vaq1g1dx.js} +4 -4
  75. package/dist/cli/{knowledge-validator-7bxvezgv.js → knowledge-validator-pdr6m77a.js} +6 -6
  76. package/dist/cli/{mcp-apr65eya.js → mcp-5sn4e5t2.js} +1 -1
  77. package/dist/cli/{model-preflight-g7b12yn2.js → model-preflight-z9p55ssn.js} +39 -39
  78. package/dist/cli/{pending-delegations-x8q7cxr7.js → pending-delegations-asyc469v.js} +10 -10
  79. package/dist/cli/{pr-subscriptions-qwr6ybcb.js → pr-subscriptions-nacx8r6a.js} +12 -10
  80. package/dist/cli/{pr-workflow-gate-qd5tfkak.js → pr-workflow-gate-j3r636zg.js} +41 -39
  81. package/dist/cli/{runner-tb3eppeg.js → runner-fns4esbf.js} +4 -4
  82. package/dist/cli/{scan-cursor-1m6dj2s2.js → scan-cursor-y9rchz83.js} +5 -5
  83. package/dist/cli/{schema-yvhamv41.js → schema-g377jsvv.js} +1 -1
  84. package/dist/cli/{scope-persistence-xdedbzdg.js → scope-persistence-dtympt37.js} +13 -13
  85. package/dist/cli/{server-nhdkvdt2.js → server-n51pvxds.js} +39 -39
  86. package/dist/cli/{skill-generator-fzvp9m8z.js → skill-generator-k3hnf8xx.js} +13 -13
  87. package/dist/cli/{snapshot-coordination-init-xqxek8kn.js → snapshot-coordination-init-k1f93806.js} +39 -39
  88. package/dist/cli/{speckit-checkoff-57tf4079.js → speckit-checkoff-w7qbrzph.js} +4 -4
  89. package/dist/cli/{workspace-snapshot-kcfkk3a2.js → workspace-snapshot-1sa8m2ea.js} +3 -3
  90. package/dist/cli/{worktree-collision-ownership-80n814a8.js → worktree-collision-ownership-4yxah5wy.js} +11 -11
  91. package/dist/cli/{worktree-isolation-kaxkr61t.js → worktree-isolation-p0pz81a1.js} +39 -39
  92. package/dist/git/pr.d.ts +73 -0
  93. package/dist/hooks/pr-workflow-gate.d.ts +69 -0
  94. package/dist/index.js +39 -39
  95. package/dist/tools/write-pr-review-trigger-eval.d.ts +2 -1
  96. package/package.json +1 -1
  97. package/dist/cli/curator-llm-factory-hkk29g2y.js +0 -81
  98. package/dist/cli/guardrail-explain-ma658hkw.js +0 -82
@@ -21,63 +21,63 @@ import {
21
21
  sanitizeWorktreeTaskId,
22
22
  standardWorktreeByCallID,
23
23
  standardWorktreeSerializationSessions
24
- } from "./index-hgfkcb1q.js";
25
- import"./index-ss6b8jpz.js";
26
- import"./index-9h93zjm3.js";
27
- import"./index-pa6fzbms.js";
24
+ } from "./index-ef3pecd4.js";
25
+ import"./index-vvajq163.js";
26
+ import"./index-hmwnegkz.js";
27
+ import"./index-chaa1v0b.js";
28
28
  import"./index-7bxssqaf.js";
29
- import"./index-1fc5aj26.js";
30
- import"./index-62akgg9d.js";
29
+ import"./index-w12y73z5.js";
30
+ import"./index-92y6cpqn.js";
31
31
  import"./index-txdagbh7.js";
32
- import"./index-smwybqka.js";
32
+ import"./index-xe34ymp8.js";
33
33
  import"./index-rdec0y3z.js";
34
- import"./index-s7va6n84.js";
35
- import"./index-ek5gvpvm.js";
36
- import"./index-dz5cbkrm.js";
37
- import"./index-5n08z6qj.js";
38
- import"./index-s68z4a39.js";
39
- import"./index-cp2nerjd.js";
34
+ import"./index-0t61279z.js";
35
+ import"./index-4h6e73bx.js";
36
+ import"./index-mnb1pg1n.js";
37
+ import"./index-qg0nhcke.js";
38
+ import"./index-9z9g1897.js";
39
+ import"./index-dbcwvc1v.js";
40
40
  import"./index-cjapb4hy.js";
41
- import"./index-vqz0avr4.js";
41
+ import"./index-wrhf5apg.js";
42
42
  import"./index-pt7h91zc.js";
43
43
  import"./index-q7sjgr1y.js";
44
- import"./index-nhw5rt5x.js";
45
- import"./index-pppjg0ct.js";
44
+ import"./index-syt8wykh.js";
45
+ import"./index-ptp6d5mm.js";
46
46
  import"./index-6b295cas.js";
47
47
  import"./index-9nyqt3kb.js";
48
- import"./index-2b3bgm20.js";
48
+ import"./index-8jq3jsas.js";
49
49
  import"./index-zsrtt42s.js";
50
- import"./index-zt3taseq.js";
51
- import"./index-cnbpht7m.js";
52
- import"./index-2c6e1p7j.js";
50
+ import"./index-3rd7gqfg.js";
51
+ import"./index-98j268bh.js";
52
+ import"./index-4z0zdcd7.js";
53
53
  import"./index-g4fs6z4e.js";
54
- import"./index-nw16apxs.js";
55
- import"./index-ppj5bjaq.js";
56
- import"./index-afmyp3kt.js";
54
+ import"./index-ezttvjcf.js";
55
+ import"./index-qj7ewgrf.js";
56
+ import"./index-5v1sqv3m.js";
57
57
  import"./index-2s7dvzff.js";
58
- import"./index-ycqsnfd1.js";
59
- import"./index-8nsjefpc.js";
58
+ import"./index-jwkybwv0.js";
59
+ import"./index-bpqw4n2f.js";
60
60
  import"./index-rtry5xyf.js";
61
61
  import {
62
62
  resolveWorktreeIsolationConfig
63
- } from "./index-7jt24hpz.js";
63
+ } from "./index-hq9f7fwf.js";
64
64
  import"./index-frcemc0b.js";
65
65
  import"./index-0725jpp7.js";
66
- import"./index-6wqv8f7d.js";
67
- import"./index-dryhmaft.js";
68
- import"./index-373880cv.js";
69
- import"./index-9g61bfj9.js";
70
- import"./index-nen885g8.js";
71
- import"./index-74yxwf8y.js";
66
+ import"./index-8fnayk3x.js";
67
+ import"./index-ay508kfq.js";
68
+ import"./index-y7s92gte.js";
69
+ import"./index-010en5sq.js";
70
+ import"./index-q9wnbz9q.js";
71
+ import"./index-t46swpqf.js";
72
72
  import"./index-ry16d01s.js";
73
73
  import"./index-rdm3px0g.js";
74
74
  import"./index-7pmbnjvj.js";
75
- import"./index-xgdypzch.js";
76
- import"./index-7n3h39h9.js";
75
+ import"./index-92bbwjek.js";
76
+ import"./index-pe1wgpvg.js";
77
77
  import"./index-vzm6zre7.js";
78
78
  import"./index-ae75rja9.js";
79
- import"./index-zxck9sr7.js";
80
- import"./index-6sffjy74.js";
79
+ import"./index-gjrs1epm.js";
80
+ import"./index-c5e1wr7h.js";
81
81
  import"./index-6cjpmvpa.js";
82
82
  import"./index-t7hmqgjy.js";
83
83
  import"./index-w6w6ny06.js";
@@ -85,11 +85,11 @@ import"./index-mc72pk74.js";
85
85
  import"./index-c1ggtmpm.js";
86
86
  import"./index-ejhxgyvm.js";
87
87
  import"./index-7g4c7s5r.js";
88
- import"./index-yj7etak0.js";
88
+ import"./index-m8dry0a6.js";
89
89
  import"./index-gx2vp8gx.js";
90
- import"./index-ekyg4p8b.js";
90
+ import"./index-teyvb5tr.js";
91
91
  import"./index-zxdawwc7.js";
92
- import"./index-rr1dggfe.js";
92
+ import"./index-nnmgg6z6.js";
93
93
  import"./index-48jvqqfa.js";
94
94
  import"./index-bk5tah7q.js";
95
95
  import"./index-gknz3bv1.js";
package/dist/git/pr.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as child_process from 'node:child_process';
2
2
  import { resolveGhExecutable } from '../utils/gh-executable.js';
3
3
  import { resolveGitExecutable } from '../utils/git-executable.js';
4
+ import { resolveGlabExecutable } from '../utils/glab-executable.js';
4
5
  import { readLaneEnvFileFromDiskSync } from './branch.js';
5
6
  export declare const GIT_TIMEOUT_MS = 30000;
6
7
  /**
@@ -60,6 +61,21 @@ declare function spawnSyncWithTransientRetry(command: string, args: string[], op
60
61
  * stdin: 'ignore', timeout, bounded stdout/stderr, proc.kill() in finally.
61
62
  */
62
63
  export declare function ghExecAsync(args: string[], cwd: string): Promise<string>;
64
+ /**
65
+ * Bounded async spawn shared by the gh and glab (GitLab) fetch paths
66
+ * (issue #2882). Same safety contract as the pre-#2882 ghExecAsync body:
67
+ * array-form argv, explicit cwd, stdin 'ignore', GIT_TIMEOUT_MS timeout,
68
+ * MAX_OUTPUT_BYTES per-stream caps, best-effort proc.kill() on settle.
69
+ *
70
+ * `label` names the CLI in error messages ('gh' / 'glab') so existing
71
+ * GitHub-path error text is unchanged. `opts.env` is an overlay merged onto
72
+ * process.env via mergeEnvForChild ONLY when defined — an absent overlay
73
+ * leaves the spawn options without an `env` key, preserving the inherit-
74
+ * process.env behavior the gh path has always had.
75
+ */
76
+ declare function forgeExecAsyncImpl(binary: string, args: string[], cwd: string, label: string, opts?: {
77
+ env?: Record<string, string>;
78
+ }): Promise<string>;
63
79
  /**
64
80
  * Test-only dependency-injection seam — see `gitignore-warning.ts:_internals`.
65
81
  * Production code calls `_internals.ghExec(...)` so tests can replace the
@@ -68,12 +84,16 @@ export declare function ghExecAsync(args: string[], cwd: string): Promise<string
68
84
  export declare const _internals: {
69
85
  ghExec: typeof ghExec;
70
86
  ghExecAsync: typeof ghExecAsync;
87
+ forgeExecAsync: typeof forgeExecAsyncImpl;
88
+ getMRPollSnapshot: typeof getMRPollSnapshot;
89
+ getMRComments: typeof getMRComments;
71
90
  spawnSyncWithTransientRetry: typeof spawnSyncWithTransientRetry;
72
91
  spawnSync: typeof __spawnSyncSeam.spawnSync;
73
92
  readLaneEnvFileFromDiskSync: typeof readLaneEnvFileFromDiskSync;
74
93
  getMergeGroupRun: typeof getMergeGroupRun;
75
94
  resolveGhExecutable: typeof resolveGhExecutable;
76
95
  resolveGitExecutable: typeof resolveGitExecutable;
96
+ resolveGlabExecutable: typeof resolveGlabExecutable;
77
97
  };
78
98
  /**
79
99
  * Check if gh CLI is available
@@ -160,6 +180,59 @@ export declare function getPRPollSnapshot(prNumber: number, repoFullName: string
160
180
  * equivalent, so this stays the second spawn of the poll cycle.
161
181
  */
162
182
  export declare function getPRReviewComments(prNumber: number, repoFullName: string, cwd: string): Promise<PRCommentResult[]>;
183
+ /**
184
+ * Honest-unavailable marker for the three GitHub-synthesized fields
185
+ * (statusCheckRollup / reviewDecision / mergeStateStatus). `getProviderCapabilities`
186
+ * is the source of truth: GitLab reports all three unavailable, so the glab-backed
187
+ * snapshot carries explicit markers instead of fabricated equivalents (#2733 AC7).
188
+ */
189
+ export declare const MR_SYNTHESIZED_FIELD_MARKER = "NOT_AVAILABLE";
190
+ /** Input for glab-backed MR fetches. `host` is the resolved forge host. */
191
+ export interface MRFetchInput {
192
+ /** Full project path (may be multi-segment: group/subgroup/repo). */
193
+ projectPath: string;
194
+ /** Merge request iid (the subscription's prNumber). */
195
+ iid: number;
196
+ cwd: string;
197
+ /** Forge host; when present and not gitlab.com, spawns get GITLAB_HOST. */
198
+ host?: string;
199
+ }
200
+ /** Check-shaped entry derived from a real GitLab pipeline (NOT a statusCheckRollup member). */
201
+ export interface MRPipelineCheck {
202
+ name: string;
203
+ status: string;
204
+ conclusion: string | null;
205
+ detailsUrl?: string;
206
+ }
207
+ /** glab-backed MR snapshot: PRPollSnapshot-compatible core plus a pipelines channel. */
208
+ export interface MRPollSnapshot {
209
+ status: PRStatusResult;
210
+ comments: PRCommentResult[];
211
+ merge: MergeStateResult;
212
+ review: ReviewStateResult;
213
+ /** Terminal pipeline verdicts for the MR head sha (empty when none terminal yet). */
214
+ pipelines: MRPipelineCheck[];
215
+ /** False when the pipelines fetch failed — caller preserves prior CI state. */
216
+ pipelinesFetchSucceeded: boolean;
217
+ }
218
+ /**
219
+ * glab-backed MR snapshot (issue #2882): three bounded spawns.
220
+ * 1. `glab mr view <iid> -R <projectPath> -F json` — MR fields.
221
+ * 2. `glab api projects/<url-encoded-path>/merge_requests/<iid>` — REST
222
+ * detail (deprecated-but-present merge_status; the issue prescribes this
223
+ * call for merge state). Approvals on this payload are intentionally NOT
224
+ * consumed: no existing event vocabulary maps to GitLab approvals without
225
+ * fabricating the GitHub-synthesized reviewDecision (#2733 AC7 binding).
226
+ * 3. `glab api .../merge_requests/<iid>/pipelines?per_page=20` — pipelines
227
+ * for the MR, filtered to the head sha, latest by id, terminal-only.
228
+ */
229
+ export declare function getMRPollSnapshot(input: MRFetchInput): Promise<MRPollSnapshot>;
230
+ /**
231
+ * glab-backed MR comments (issue #2882): the MR notes endpoint, ascending by
232
+ * creation time, system notes excluded (automation notes are not user
233
+ * comments). Bounded single page (per_page=100).
234
+ */
235
+ export declare function getMRComments(input: MRFetchInput): Promise<PRCommentResult[]>;
163
236
  /**
164
237
  * Result of fetching a GitHub Actions run for a PR's merge group.
165
238
  */
@@ -15,6 +15,7 @@ import { type PrReviewDimensionCancellationRecord, type PrReviewPartialBaseCover
15
15
  import { type CriticOutcome } from '../pr-review/finding-policy.js';
16
16
  import { type PrReviewComposablePhase, type PrReviewItemClaim, type PrReviewPhaseComposition, parseCriticVerdict } from '../pr-review/legacy-transcript-adapter.js';
17
17
  import { withPrWorkflowCheckoutMutationLock, workflowCheckoutMutationLockRelativePath, workflowGateStateLockRelativePath, workflowGateStateRelativePath } from '../pr-review/persistence.js';
18
+ import { type ForgeContext } from '../providers/forge-provider.js';
18
19
  import { classifyLaneLivenessCondition, type EffectivePrLaneHorizon, resolveEffectivePrLaneHorizonMs } from './lane-liveness-watchdog.js';
19
20
  export type { PrReviewDimensionCancellationRecord, PrReviewDimensionTerminalState, PrReviewPartialBaseCoverageRecord, PrReviewPartialBaseCoverageRecordV1, PrReviewPartialBaseCoverageRecordV2, PrReviewReportVerdict, PrReviewTerminalCoverageKind, PrReviewTerminalCoverageSettlement, PrReviewUnresolvedDimensionRecord, } from '../pr-review/completion.js';
20
21
  export { allowedPrReviewReportVerdicts, normalizePrReviewPartialBaseCoverageRecord, PR_REVIEW_REPORT_VERDICTS, readPrReviewTerminalCoverageForReport, rollbackPrReviewPartialBaseCoverageAdmission, } from '../pr-review/completion.js';
@@ -406,6 +407,22 @@ interface PrReviewValidationBatchRecord {
406
407
  }>;
407
408
  validatedAt: string;
408
409
  }
410
+ /**
411
+ * Issue #2878: one admitted micro-dispatch acknowledgment. The dead-family
412
+ * admission in `write_pr_review_trigger_eval` counts these per trigger family
413
+ * (filtered by pr head) to mechanically prove the bounded retry budget was
414
+ * exhausted before a liveness-dead family may be disclosed.
415
+ */
416
+ interface PrReviewMicroFamilyDispatchRecord {
417
+ batchId: string;
418
+ prHeadSha: string;
419
+ lanes: Array<{
420
+ laneId: string;
421
+ workflowLane: string;
422
+ ownedWorkflowLanes?: string[];
423
+ }>;
424
+ admittedAt: string;
425
+ }
409
426
  /**
410
427
  * Per-batch coherence keys for item-keyed reviewer/critic composition.
411
428
  *
@@ -483,6 +500,15 @@ export interface PrWorkflowGateState {
483
500
  prReviewContractRetryDimensions?: PrReviewBaseDimensionId[];
484
501
  /** Canonical ordered semantic ledger frozen by the first micro dispatch. */
485
502
  prReviewTriggerLedger?: PrReviewInlineTriggerRow[];
503
+ /**
504
+ * Issue #2878: per-family micro dispatch attempt ledger, appended by every
505
+ * micro-dispatch acknowledgment (`recordPrReviewMicroFamilyDispatch`). The
506
+ * dead-family admission in `write_pr_review_trigger_eval` counts these per
507
+ * trigger family (filtered by pr head) to mechanically prove the bounded
508
+ * retry budget was exhausted before disclosing a liveness-dead family.
509
+ * Bounded at MAX_WORKFLOW_BATCHES with fail-closed overflow.
510
+ */
511
+ prReviewMicroFamilyDispatches?: PrReviewMicroFamilyDispatchRecord[];
486
512
  prReviewTriggerEvalPath?: string;
487
513
  /**
488
514
  * The run_id bound to the trigger-evaluation receipt at first consumption.
@@ -623,6 +649,7 @@ export declare function activatePrWorkflow(directory: string, sessionID: string,
623
649
  prHeadSha?: string;
624
650
  requireCheckoutPreflight?: boolean;
625
651
  prUrl?: string;
652
+ forge?: ForgeContext;
626
653
  }): Promise<PrWorkflowGateState>;
627
654
  /**
628
655
  * Issue #2601: append skill-contract advisories detected by the auto-resume
@@ -1173,6 +1200,38 @@ export declare function assertPrReviewBaseCoverageSettled(directory: string, ses
1173
1200
  };
1174
1201
  }>;
1175
1202
  /** Persist a council/reviewer/critic validation batch before launch. */
1203
+ /**
1204
+ * Issue #2878: record one admitted micro-dispatch acknowledgment in the
1205
+ * per-family dispatch attempt ledger. The dead-family admission in
1206
+ * `write_pr_review_trigger_eval` counts these records (per trigger family,
1207
+ * filtered by pr head) to mechanically prove the bounded retry budget
1208
+ * (initial dispatch plus `PR_REVIEW_MICRO_FAMILY_RETRY_BUDGET` retries) was
1209
+ * exhausted before a liveness-dead family may be disclosed.
1210
+ *
1211
+ * Crash-window disposition, by ordering:
1212
+ * - The record is persisted at acknowledgment time, strictly before any lane
1213
+ * session is created, so no dead lane can exist whose dispatch was not
1214
+ * first durably counted — the count can never under-report relative to the
1215
+ * lanes that actually ran.
1216
+ * - A cap throw aborts the dispatch itself (the lane never launches), the
1217
+ * same fail-closed behavior as the validation-batch limit below.
1218
+ * - A crash between this persist and lane launch leaves an orphan entry whose
1219
+ * lanes never started. That is benign: a retry of the exact same dispatch
1220
+ * call is a no-op (batchId idempotence below), and the over-count direction
1221
+ * is conservative for a disclosure gate that admits only at or above the
1222
+ * budget threshold — the cited (batch, lane) must still exist as a real
1223
+ * stale delegation record to be disclosed at all, so phantom attempts
1224
+ * alone can never unlock a disclosure.
1225
+ *
1226
+ * Unlike `recordPrReviewValidationBatch`, a duplicate batchId is a no-op
1227
+ * rather than a throw: validation batches are one-shot contracts, while a
1228
+ * dispatch acknowledgment is an idempotent fact that must survive a
1229
+ * crash-retry of the same dispatch call without double-counting.
1230
+ */
1231
+ export declare function recordPrReviewMicroFamilyDispatch(directory: string, sessionID: string, lanes: readonly PrWorkflowLaneSpec[], options: {
1232
+ batchId: string;
1233
+ prHeadSha: string;
1234
+ }): Promise<PrWorkflowGateState>;
1176
1235
  export declare function recordPrReviewValidationBatch(directory: string, sessionID: string, phase: PrReviewValidationPhase, lanes: readonly PrWorkflowLaneSpec[], options: {
1177
1236
  batchId: string;
1178
1237
  prHeadSha: string;
@@ -1566,6 +1625,16 @@ export declare const _test_exports: {
1566
1625
  result: "NOT_TRIGGERED";
1567
1626
  evidence: string;
1568
1627
  })[] | undefined;
1628
+ prReviewMicroFamilyDispatches?: {
1629
+ batchId: string;
1630
+ prHeadSha: string;
1631
+ lanes: {
1632
+ laneId: string;
1633
+ workflowLane: string;
1634
+ ownedWorkflowLanes?: string[] | undefined;
1635
+ }[];
1636
+ admittedAt: string;
1637
+ }[] | undefined;
1569
1638
  prReviewTriggerEvalPath?: string | undefined;
1570
1639
  prReviewTriggerEvalRunId?: string | undefined;
1571
1640
  prReviewValidationBatches?: {