opencode-swarm 7.180.0 → 7.180.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 (82) hide show
  1. package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
  2. package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
  3. package/dist/agents/architect.d.ts +67 -0
  4. package/dist/agents/council-prompts.d.ts +3 -3
  5. package/dist/agents/index.d.ts +1 -1
  6. package/dist/cli/{coder-settlement-34z9xgnx.js → coder-settlement-b57917a3.js} +7 -7
  7. package/dist/cli/{config-doctor-tkfrwztz.js → config-doctor-ebat06eq.js} +2 -2
  8. package/dist/cli/{core-z9ybzpvr.js → core-8k41qh0d.js} +1 -1
  9. package/dist/cli/{curation-policy-gwzmjmt7.js → curation-policy-m3x9mkj9.js} +4 -4
  10. package/dist/cli/{curator-zv4qs07j.js → curator-8yb3qkxs.js} +30 -30
  11. package/dist/cli/{curator-drift-3bbn011w.js → curator-drift-3av9hffm.js} +4 -4
  12. package/dist/cli/{curator-llm-factory-e162g7xp.js → curator-llm-factory-htgqafq0.js} +30 -30
  13. package/dist/cli/{evidence-summary-service-wrfth5tr.js → evidence-summary-service-s258ea5t.js} +13 -13
  14. package/dist/cli/{gate-evidence-adqbxnm7.js → gate-evidence-fqxpf3xz.js} +4 -4
  15. package/dist/cli/{guardrail-explain-dn96802k.js → guardrail-explain-r0qxa4zy.js} +31 -31
  16. package/dist/cli/{guardrail-log-rcza6v3y.js → guardrail-log-j2wdmvmy.js} +6 -6
  17. package/dist/cli/{guardrail-reset-fjn42e0n.js → guardrail-reset-wb2eqbvf.js} +30 -30
  18. package/dist/cli/{hive-promoter-hgqqn7qw.js → hive-promoter-kxpc3r17.js} +30 -30
  19. package/dist/cli/{index-zvxy0mev.js → index-12ewkms0.js} +1 -1
  20. package/dist/cli/{index-ekgc71m1.js → index-2q5m4m2r.js} +7 -7
  21. package/dist/cli/{index-htrb9ec3.js → index-38cfx8g8.js} +2 -2
  22. package/dist/cli/{index-1p8fk9jb.js → index-3bbjpbmn.js} +2 -2
  23. package/dist/cli/{index-ret97f1t.js → index-3zvp7t5d.js} +5 -5
  24. package/dist/cli/{index-5gmn0a3j.js → index-50v672wd.js} +3 -3
  25. package/dist/cli/{index-jmrsfhwq.js → index-516j9vsk.js} +1 -1
  26. package/dist/cli/{index-7w6dnpvc.js → index-600aqfvm.js} +32 -30
  27. package/dist/cli/{index-5yc5n4ae.js → index-6gcxgx84.js} +1 -1
  28. package/dist/cli/{index-qt0793qm.js → index-6mwha20t.js} +3 -3
  29. package/dist/cli/{index-mhrn7hbb.js → index-855qxtdm.js} +3 -3
  30. package/dist/cli/{index-3jap3516.js → index-as4xaams.js} +1 -1
  31. package/dist/cli/{index-1hzqyx13.js → index-bhmrgbyv.js} +1 -1
  32. package/dist/cli/{index-jrfv2am8.js → index-cj64vp08.js} +3 -3
  33. package/dist/cli/{index-5m378633.js → index-dzm5nfh7.js} +4 -4
  34. package/dist/cli/{index-0v1rtanv.js → index-ea9fk6v0.js} +1 -1
  35. package/dist/cli/{index-bx70zs8d.js → index-g062wnw1.js} +1 -1
  36. package/dist/cli/{index-7pj0x345.js → index-gw5egd8j.js} +32 -32
  37. package/dist/cli/{index-pnt98k7z.js → index-gy3tcmk4.js} +6 -6
  38. package/dist/cli/{index-caj76d0f.js → index-k5vwnnym.js} +3 -3
  39. package/dist/cli/{index-dcttq1mn.js → index-k6f0nryj.js} +2 -2
  40. package/dist/cli/{index-8b1f2t5q.js → index-n5carmk0.js} +1 -1
  41. package/dist/cli/{index-jscqefqm.js → index-rejpbgxp.js} +1 -1
  42. package/dist/cli/{index-defq2crz.js → index-rp4akjrm.js} +1 -1
  43. package/dist/cli/{index-aspxz5r5.js → index-s0zgz4p1.js} +1 -1
  44. package/dist/cli/{index-06crt1ej.js → index-tnhk72rs.js} +3 -3
  45. package/dist/cli/{index-v1sc1gxv.js → index-v0par978.js} +4 -4
  46. package/dist/cli/{index-b9z9gvx0.js → index-v7fx8q3z.js} +1 -1
  47. package/dist/cli/{index-x6kjbjya.js → index-wx3wz7ya.js} +4 -4
  48. package/dist/cli/{index-kp654qcw.js → index-xd0e4amf.js} +9 -9
  49. package/dist/cli/{index-zptq8mp1.js → index-xj5z92qz.js} +1 -1
  50. package/dist/cli/{index-93vk5s7v.js → index-y30y1rkg.js} +3 -3
  51. package/dist/cli/{index-2h0qng38.js → index-yf7tdhpz.js} +2 -2
  52. package/dist/cli/{index-cxgr6ad5.js → index-z2xf153n.js} +4 -4
  53. package/dist/cli/{index-dnbqmay5.js → index-z2zrcecq.js} +182 -74
  54. package/dist/cli/index.js +31 -31
  55. package/dist/cli/{knowledge-escalator-x8vcmb6k.js → knowledge-escalator-n30h6ran.js} +10 -10
  56. package/dist/cli/{knowledge-events-naf9kyyc.js → knowledge-events-k2qqase2.js} +8 -8
  57. package/dist/cli/{knowledge-link-g0q25hqv.js → knowledge-link-s2qs178z.js} +3 -3
  58. package/dist/cli/{knowledge-store-dnv0ph42.js → knowledge-store-zy226v5a.js} +4 -4
  59. package/dist/cli/{knowledge-validator-a1rfzkmv.js → knowledge-validator-qgyxdpc9.js} +6 -6
  60. package/dist/cli/{mcp-hnb0m05a.js → mcp-pj7acze3.js} +1 -1
  61. package/dist/cli/{pending-delegations-05p6cmbh.js → pending-delegations-sgnnyw55.js} +6 -6
  62. package/dist/cli/{pr-subscriptions-a2djfzyx.js → pr-subscriptions-7fb7xm3q.js} +6 -6
  63. package/dist/cli/{pr-workflow-gate-wkmx8nr6.js → pr-workflow-gate-5dqcrkz6.js} +30 -30
  64. package/dist/cli/{runner-hkbds12j.js → runner-p9hstpxn.js} +4 -4
  65. package/dist/cli/{scan-cursor-4khfn5pm.js → scan-cursor-jc7wwb7e.js} +5 -5
  66. package/dist/cli/{schema-a5zb02h8.js → schema-5k68crjb.js} +1 -1
  67. package/dist/cli/{scope-persistence-nsw324ce.js → scope-persistence-xeg4khwk.js} +10 -10
  68. package/dist/cli/{server-exj4wt8j.js → server-ej6tzd7t.js} +30 -30
  69. package/dist/cli/{skill-generator-r2cdtx7b.js → skill-generator-nspt9b3n.js} +12 -12
  70. package/dist/cli/{snapshot-coordination-init-sad6q0a2.js → snapshot-coordination-init-3rs3zpaa.js} +30 -30
  71. package/dist/cli/{speckit-checkoff-46g9sqak.js → speckit-checkoff-dqf636ya.js} +3 -3
  72. package/dist/cli/{telemetry-qxav5cdk.js → telemetry-zhcgfe70.js} +1 -1
  73. package/dist/cli/{worktree-collision-ownership-4znkfq1t.js → worktree-collision-ownership-rbzgbvj4.js} +6 -6
  74. package/dist/cli/{worktree-isolation-mv9ee00v.js → worktree-isolation-6zpnzr70.js} +30 -30
  75. package/dist/council/disagreement-detector.d.ts +23 -1
  76. package/dist/council/general-council-service.d.ts +40 -3
  77. package/dist/failures/invocation-failure.d.ts +11 -0
  78. package/dist/hooks/system-enhancer.d.ts +4 -2
  79. package/dist/hooks/system-render-boundary.d.ts +68 -0
  80. package/dist/index.js +17 -15
  81. package/dist/utils/provider-error-classification.d.ts +11 -0
  82. package/package.json +1 -1
@@ -33,33 +33,33 @@ import {
33
33
  sanitizeSlug,
34
34
  selectCandidateEntries,
35
35
  writeEvalStub
36
- } from "./index-5gmn0a3j.js";
36
+ } from "./index-50v672wd.js";
37
37
  import"./index-q7sjgr1y.js";
38
- import"./index-ekgc71m1.js";
38
+ import"./index-2q5m4m2r.js";
39
39
  import"./index-gc6h1fmf.js";
40
40
  import"./index-2s7dvzff.js";
41
- import"./index-5m378633.js";
42
- import"./index-5yc5n4ae.js";
41
+ import"./index-dzm5nfh7.js";
42
+ import"./index-6gcxgx84.js";
43
43
  import"./index-rtry5xyf.js";
44
- import"./index-dcttq1mn.js";
44
+ import"./index-k6f0nryj.js";
45
45
  import"./index-frcemc0b.js";
46
46
  import"./index-0725jpp7.js";
47
- import"./index-jmrsfhwq.js";
48
- import"./index-pnt98k7z.js";
47
+ import"./index-516j9vsk.js";
48
+ import"./index-gy3tcmk4.js";
49
49
  import"./index-vzm6zre7.js";
50
50
  import"./index-ae75rja9.js";
51
- import"./index-zvxy0mev.js";
52
- import"./index-0v1rtanv.js";
53
- import"./index-qt0793qm.js";
51
+ import"./index-12ewkms0.js";
52
+ import"./index-ea9fk6v0.js";
53
+ import"./index-6mwha20t.js";
54
54
  import"./index-1xnse449.js";
55
55
  import"./index-c1ggtmpm.js";
56
56
  import"./index-ejhxgyvm.js";
57
57
  import"./index-7g4c7s5r.js";
58
58
  import"./index-989v83pb.js";
59
59
  import"./index-gx2vp8gx.js";
60
- import"./index-zptq8mp1.js";
60
+ import"./index-xj5z92qz.js";
61
61
  import"./index-zxdawwc7.js";
62
- import"./index-defq2crz.js";
62
+ import"./index-rp4akjrm.js";
63
63
  import"./index-w872yykk.js";
64
64
  import"./index-bk5tah7q.js";
65
65
  import"./index-gknz3bv1.js";
@@ -8,66 +8,66 @@ import {
8
8
  markSnapshotCoordinationClosing,
9
9
  retrySnapshotCoordinationInitialization,
10
10
  startSnapshotCoordinationInitialization
11
- } from "./index-dnbqmay5.js";
12
- import"./index-06crt1ej.js";
11
+ } from "./index-z2zrcecq.js";
12
+ import"./index-tnhk72rs.js";
13
13
  import"./index-hamqvzqn.js";
14
- import"./index-jscqefqm.js";
14
+ import"./index-rejpbgxp.js";
15
15
  import"./index-nhxykfyy.js";
16
- import"./index-1hzqyx13.js";
17
- import"./index-kp654qcw.js";
18
- import"./index-aspxz5r5.js";
16
+ import"./index-bhmrgbyv.js";
17
+ import"./index-xd0e4amf.js";
18
+ import"./index-s0zgz4p1.js";
19
19
  import"./index-txdagbh7.js";
20
- import"./index-bx70zs8d.js";
20
+ import"./index-g062wnw1.js";
21
21
  import"./index-6b295cas.js";
22
- import"./index-5gmn0a3j.js";
23
- import"./index-ret97f1t.js";
24
- import"./index-2h0qng38.js";
22
+ import"./index-50v672wd.js";
23
+ import"./index-3zvp7t5d.js";
24
+ import"./index-yf7tdhpz.js";
25
25
  import"./index-rdec0y3z.js";
26
- import"./index-93vk5s7v.js";
26
+ import"./index-y30y1rkg.js";
27
27
  import"./index-cjapb4hy.js";
28
28
  import"./index-zsrtt42s.js";
29
- import"./index-cxgr6ad5.js";
29
+ import"./index-z2xf153n.js";
30
30
  import"./index-bdpgfep1.js";
31
31
  import"./index-92m05mew.js";
32
32
  import"./index-pt7h91zc.js";
33
33
  import"./index-q7sjgr1y.js";
34
- import"./index-b9z9gvx0.js";
35
- import"./index-caj76d0f.js";
36
- import"./index-8b1f2t5q.js";
37
- import"./index-v1sc1gxv.js";
38
- import"./index-ekgc71m1.js";
34
+ import"./index-v7fx8q3z.js";
35
+ import"./index-k5vwnnym.js";
36
+ import"./index-n5carmk0.js";
37
+ import"./index-v0par978.js";
38
+ import"./index-2q5m4m2r.js";
39
39
  import"./index-gc6h1fmf.js";
40
40
  import"./index-2s7dvzff.js";
41
- import"./index-5m378633.js";
42
- import"./index-5yc5n4ae.js";
41
+ import"./index-dzm5nfh7.js";
42
+ import"./index-6gcxgx84.js";
43
43
  import"./index-rtry5xyf.js";
44
- import"./index-dcttq1mn.js";
44
+ import"./index-k6f0nryj.js";
45
45
  import"./index-frcemc0b.js";
46
46
  import"./index-0725jpp7.js";
47
- import"./index-jrfv2am8.js";
48
- import"./index-x6kjbjya.js";
49
- import"./index-htrb9ec3.js";
47
+ import"./index-cj64vp08.js";
48
+ import"./index-wx3wz7ya.js";
49
+ import"./index-38cfx8g8.js";
50
50
  import"./index-91dhg3wr.js";
51
51
  import"./index-vmthakz0.js";
52
52
  import"./index-bv4b8tpa.js";
53
53
  import"./index-rdm3px0g.js";
54
54
  import"./index-ry16d01s.js";
55
- import"./index-jmrsfhwq.js";
56
- import"./index-pnt98k7z.js";
55
+ import"./index-516j9vsk.js";
56
+ import"./index-gy3tcmk4.js";
57
57
  import"./index-vzm6zre7.js";
58
58
  import"./index-ae75rja9.js";
59
- import"./index-zvxy0mev.js";
60
- import"./index-0v1rtanv.js";
61
- import"./index-qt0793qm.js";
59
+ import"./index-12ewkms0.js";
60
+ import"./index-ea9fk6v0.js";
61
+ import"./index-6mwha20t.js";
62
62
  import"./index-1xnse449.js";
63
63
  import"./index-c1ggtmpm.js";
64
64
  import"./index-ejhxgyvm.js";
65
65
  import"./index-7g4c7s5r.js";
66
66
  import"./index-989v83pb.js";
67
67
  import"./index-gx2vp8gx.js";
68
- import"./index-zptq8mp1.js";
68
+ import"./index-xj5z92qz.js";
69
69
  import"./index-zxdawwc7.js";
70
- import"./index-defq2crz.js";
70
+ import"./index-rp4akjrm.js";
71
71
  import"./index-w872yykk.js";
72
72
  import"./index-bk5tah7q.js";
73
73
  import"./index-gknz3bv1.js";
@@ -7,13 +7,13 @@ import {
7
7
  parseSpeckitTasksContent,
8
8
  propagateSpeckitCheckoff,
9
9
  writeSpeckitCheckoffLedger
10
- } from "./index-b9z9gvx0.js";
10
+ } from "./index-v7fx8q3z.js";
11
11
  import"./index-ejhxgyvm.js";
12
12
  import"./index-7g4c7s5r.js";
13
13
  import"./index-989v83pb.js";
14
- import"./index-zptq8mp1.js";
14
+ import"./index-xj5z92qz.js";
15
15
  import"./index-zxdawwc7.js";
16
- import"./index-defq2crz.js";
16
+ import"./index-rp4akjrm.js";
17
17
  import"./index-w872yykk.js";
18
18
  import"./index-bk5tah7q.js";
19
19
  import"./index-gknz3bv1.js";
@@ -14,7 +14,7 @@ import {
14
14
  startHeartbeatTracking,
15
15
  stopHeartbeatTracking,
16
16
  telemetry
17
- } from "./index-qt0793qm.js";
17
+ } from "./index-6mwha20t.js";
18
18
  import"./index-1xnse449.js";
19
19
  import"./index-c1ggtmpm.js";
20
20
  import"./index-gknz3bv1.js";
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  scanDelegationFallbacksForRecovery,
15
15
  scanDelegationsForRecovery
16
- } from "./index-v1sc1gxv.js";
16
+ } from "./index-v0par978.js";
17
17
  import"./index-gc6h1fmf.js";
18
18
  import"./index-2s7dvzff.js";
19
19
  import"./index-91dhg3wr.js";
@@ -21,13 +21,13 @@ import"./index-vmthakz0.js";
21
21
  import"./index-bv4b8tpa.js";
22
22
  import"./index-rdm3px0g.js";
23
23
  import"./index-ry16d01s.js";
24
- import"./index-jmrsfhwq.js";
25
- import"./index-pnt98k7z.js";
24
+ import"./index-516j9vsk.js";
25
+ import"./index-gy3tcmk4.js";
26
26
  import"./index-vzm6zre7.js";
27
27
  import"./index-ae75rja9.js";
28
- import"./index-zvxy0mev.js";
29
- import"./index-0v1rtanv.js";
30
- import"./index-qt0793qm.js";
28
+ import"./index-12ewkms0.js";
29
+ import"./index-ea9fk6v0.js";
30
+ import"./index-6mwha20t.js";
31
31
  import {
32
32
  canonicalRootKeyFresh
33
33
  } from "./index-1xnse449.js";
@@ -21,68 +21,68 @@ import {
21
21
  sanitizeWorktreeTaskId,
22
22
  standardWorktreeByCallID,
23
23
  standardWorktreeSerializationSessions
24
- } from "./index-dnbqmay5.js";
25
- import"./index-06crt1ej.js";
24
+ } from "./index-z2zrcecq.js";
25
+ import"./index-tnhk72rs.js";
26
26
  import"./index-hamqvzqn.js";
27
- import"./index-jscqefqm.js";
27
+ import"./index-rejpbgxp.js";
28
28
  import"./index-nhxykfyy.js";
29
- import"./index-1hzqyx13.js";
30
- import"./index-kp654qcw.js";
31
- import"./index-aspxz5r5.js";
29
+ import"./index-bhmrgbyv.js";
30
+ import"./index-xd0e4amf.js";
31
+ import"./index-s0zgz4p1.js";
32
32
  import"./index-txdagbh7.js";
33
- import"./index-bx70zs8d.js";
33
+ import"./index-g062wnw1.js";
34
34
  import"./index-6b295cas.js";
35
- import"./index-5gmn0a3j.js";
36
- import"./index-ret97f1t.js";
37
- import"./index-2h0qng38.js";
35
+ import"./index-50v672wd.js";
36
+ import"./index-3zvp7t5d.js";
37
+ import"./index-yf7tdhpz.js";
38
38
  import"./index-rdec0y3z.js";
39
- import"./index-93vk5s7v.js";
39
+ import"./index-y30y1rkg.js";
40
40
  import"./index-cjapb4hy.js";
41
41
  import"./index-zsrtt42s.js";
42
- import"./index-cxgr6ad5.js";
42
+ import"./index-z2xf153n.js";
43
43
  import"./index-bdpgfep1.js";
44
44
  import"./index-92m05mew.js";
45
45
  import"./index-pt7h91zc.js";
46
46
  import"./index-q7sjgr1y.js";
47
- import"./index-b9z9gvx0.js";
48
- import"./index-caj76d0f.js";
49
- import"./index-8b1f2t5q.js";
50
- import"./index-v1sc1gxv.js";
51
- import"./index-ekgc71m1.js";
47
+ import"./index-v7fx8q3z.js";
48
+ import"./index-k5vwnnym.js";
49
+ import"./index-n5carmk0.js";
50
+ import"./index-v0par978.js";
51
+ import"./index-2q5m4m2r.js";
52
52
  import"./index-gc6h1fmf.js";
53
53
  import"./index-2s7dvzff.js";
54
- import"./index-5m378633.js";
55
- import"./index-5yc5n4ae.js";
54
+ import"./index-dzm5nfh7.js";
55
+ import"./index-6gcxgx84.js";
56
56
  import"./index-rtry5xyf.js";
57
57
  import {
58
58
  resolveWorktreeIsolationConfig
59
- } from "./index-dcttq1mn.js";
59
+ } from "./index-k6f0nryj.js";
60
60
  import"./index-frcemc0b.js";
61
61
  import"./index-0725jpp7.js";
62
- import"./index-jrfv2am8.js";
63
- import"./index-x6kjbjya.js";
64
- import"./index-htrb9ec3.js";
62
+ import"./index-cj64vp08.js";
63
+ import"./index-wx3wz7ya.js";
64
+ import"./index-38cfx8g8.js";
65
65
  import"./index-91dhg3wr.js";
66
66
  import"./index-vmthakz0.js";
67
67
  import"./index-bv4b8tpa.js";
68
68
  import"./index-rdm3px0g.js";
69
69
  import"./index-ry16d01s.js";
70
- import"./index-jmrsfhwq.js";
71
- import"./index-pnt98k7z.js";
70
+ import"./index-516j9vsk.js";
71
+ import"./index-gy3tcmk4.js";
72
72
  import"./index-vzm6zre7.js";
73
73
  import"./index-ae75rja9.js";
74
- import"./index-zvxy0mev.js";
75
- import"./index-0v1rtanv.js";
76
- import"./index-qt0793qm.js";
74
+ import"./index-12ewkms0.js";
75
+ import"./index-ea9fk6v0.js";
76
+ import"./index-6mwha20t.js";
77
77
  import"./index-1xnse449.js";
78
78
  import"./index-c1ggtmpm.js";
79
79
  import"./index-ejhxgyvm.js";
80
80
  import"./index-7g4c7s5r.js";
81
81
  import"./index-989v83pb.js";
82
82
  import"./index-gx2vp8gx.js";
83
- import"./index-zptq8mp1.js";
83
+ import"./index-xj5z92qz.js";
84
84
  import"./index-zxdawwc7.js";
85
- import"./index-defq2crz.js";
85
+ import"./index-rp4akjrm.js";
86
86
  import"./index-w872yykk.js";
87
87
  import"./index-bk5tah7q.js";
88
88
  import"./index-gknz3bv1.js";
@@ -23,7 +23,29 @@
23
23
  * forward to Round 2, not full Round 1 context — mirrors the "semantic forget
24
24
  * gate" selective-retention insight and keeps prompt sizes bounded.
25
25
  */
26
- import type { GeneralCouncilDisagreement, GeneralCouncilMemberResponse } from './general-council-types.js';
26
+ import type { GeneralCouncilClaim, GeneralCouncilDisagreement, GeneralCouncilMemberResponse } from './general-council-types.js';
27
+ /**
28
+ * Defensive shape check for one structured claim. Malformed claims are
29
+ * skipped individually — they must never break the detector or suppress the
30
+ * fallback passes (issue #2102 contract G safety rule).
31
+ *
32
+ * Exported (issue #2578) so the general-council synthesis service applies the
33
+ * SAME well-formedness filter when deciding which members hold explicit
34
+ * contrary positions for consensus clustering — one definition, no duplicate
35
+ * shape-check.
36
+ */
37
+ export declare function isWellFormedClaim(value: unknown): value is GeneralCouncilClaim;
38
+ /**
39
+ * Two stances are contrary when they differ, neither is neutral, and at
40
+ * least one is an explicit contrary position (`oppose` or `alternative`).
41
+ * `concern` flags risk without taking a side, so support-vs-concern is not
42
+ * auto-detected here — the marker/heuristic passes still cover it.
43
+ *
44
+ * Exported (issue #2578): the synthesis service reuses this canonical
45
+ * definition to identify a member's explicit contrary stance
46
+ * (`areContraryStances(stance, 'support')`) instead of duplicating the list.
47
+ */
48
+ export declare function areContraryStances(a: GeneralCouncilClaim['stance'], b: GeneralCouncilClaim['stance']): boolean;
27
49
  /**
28
50
  * Detect disagreements across Round 1 member responses.
29
51
  *
@@ -9,14 +9,51 @@
9
9
  * member confidence rather than counted by headcount. A claim is a consensus
10
10
  * point only when its weighted agreement exceeds 0.6 across members.
11
11
  *
12
- * MAINTAIN/CONCEDE/NUANCE protocol (ConfMAD): a Round 2 response with the
13
- * CONCEDE keyword on a topic resolves the corresponding Round 1 disagreement;
14
- * MAINTAIN leaves it persisting; NUANCE marks it persisting-with-boundary.
12
+ * MAINTAIN/CONCEDE/NUANCE protocol (ConfMAD): a Round 2 response resolves a
13
+ * Round 1 disagreement only when a disputant declares a paragraph-leading
14
+ * CONCEDE on that topic (the documented stance grammar in
15
+ * ../agents/council-prompts.ts); MAINTAIN and NUANCE both leave it
16
+ * persisting (NUANCE carries no distinct synthesis behavior — it is parsed
17
+ * only so the stance grammar is recognized and recorded). Issue #2578: prose
18
+ * that merely CONTAINS the word "concede" (e.g. "MAINTAIN — I do not
19
+ * concede…") is not a concession, and a member detected as holding a
20
+ * contrary position (typed oppose/alternative claim, or appearing in any
21
+ * detected disagreement) is disagreement evidence that must never be emitted
22
+ * as consensus.
15
23
  */
16
24
  import type { GeneralCouncilDeliberationResponse, GeneralCouncilMemberResponse, GeneralCouncilResult } from './general-council-types.js';
25
+ /** Round 2 stance keywords, exactly as documented in council-prompts.ts. */
26
+ declare const LEADING_STANCE_KEYWORDS: readonly ["MAINTAIN", "CONCEDE", "NUANCE"];
27
+ export type GeneralCouncilLeadingStance = (typeof LEADING_STANCE_KEYWORDS)[number];
28
+ /** One paragraph-leading stance declaration parsed from a Round 2 response. */
29
+ export interface LeadingStanceDeclaration {
30
+ stance: GeneralCouncilLeadingStance;
31
+ /** The full text of the paragraph whose first word is the stance keyword. */
32
+ paragraph: string;
33
+ }
34
+ /**
35
+ * Parse the documented paragraph-leading stance contract (issue #2578 sole
36
+ * owner: this module — callers must reuse this parser, not re-implement it).
37
+ *
38
+ * A declaration exists only when the FIRST word of a paragraph (blank-line
39
+ * separated) is exactly one of the uppercase keywords MAINTAIN / CONCEDE /
40
+ * NUANCE (case-sensitive, as the prompt documents them), standing alone
41
+ * before whitespace, punctuation, or a markdown decorator. Prose such as
42
+ * "I do not concede" or "After review I concede…" never leads a paragraph
43
+ * with the keyword and so yields no declaration — the conservative direction
44
+ * (no concession).
45
+ *
46
+ * Council prompts sanction markdown inside the response string ("Markdown OK
47
+ * inside the string"), so common paragraph decorators must not hide a
48
+ * declaration: leading blockquote/heading/list markers are stripped before
49
+ * the first-word check, emphasis wrapping (bold/italic/code) and hyphen
50
+ * joins are boundary characters, and zero-width characters are removed.
51
+ */
52
+ export declare function extractLeadingStanceDeclarations(response: string): LeadingStanceDeclaration[];
17
53
  /**
18
54
  * Pure synthesis. Given completed member responses, produces the final
19
55
  * `GeneralCouncilResult` (without `moderatorOutput` — moderator is invoked
20
56
  * by the architect after this returns and populated separately).
21
57
  */
22
58
  export declare function synthesizeGeneralCouncil(question: string, mode: 'general' | 'spec_review', round1Responses: GeneralCouncilMemberResponse[], round2Responses: GeneralCouncilDeliberationResponse[]): GeneralCouncilResult;
59
+ export {};
@@ -58,6 +58,17 @@ export interface ToolFailureClassificationInput {
58
58
  */
59
59
  export declare function sanitizeFailureEvidenceDisplay(value: string): string;
60
60
  declare function isNeutralExitOne(command: string): boolean;
61
+ /**
62
+ * Provider failure categories in use (enumerated per issue #2673 plan-critic
63
+ * finding 6, so downstream category-prefix consumers — telemetry filters,
64
+ * dashboards, circuit thresholds — can discover every leaf):
65
+ * provider.cancelled, provider.authentication_configuration,
66
+ * provider.quota_billing, provider.rate_limit, provider.unavailable,
67
+ * provider.context_window, provider.content_policy,
68
+ * provider.request_shape (#2673: deterministic request-shape rejections,
69
+ * e.g. a strict single-system provider rejecting a multi-system payload),
70
+ * provider.unknown.
71
+ */
61
72
  export declare function classifyProviderFailure(error: unknown, action?: ActionIdentityInput): InvocationFailureRecordV1;
62
73
  export declare function isRetryableProviderFailure(record: InvocationFailureRecordV1): boolean;
63
74
  export declare function classifyToolInvocationFailure(input: ToolFailureClassificationInput): InvocationFailureRecordV1 | null;
@@ -10,8 +10,10 @@ import type { RuntimePlan } from '../config/plan-schema';
10
10
  /**
11
11
  * Build the [spec-drift] advisory injected into the model's system prompt
12
12
  * after every loadPlan whenever spec staleness is detected (issue #853
13
- * Layer A). The text is appended to `output.system` and survives the
14
- * single-system-message collapse at `experimental.chat.system.transform`.
13
+ * Layer A). The text is appended to `output.system`; when the system render
14
+ * boundary (issue #2673) resolves `strict-single-system` for this request's
15
+ * model, the joined single entry retains the `[spec-drift]` block
16
+ * byte-verbatim (pinned by the boundary's acceptance checks).
15
17
  *
16
18
  * The "Do NOT proceed" line enumerates every tool in SPEC_DRIFT_BLOCKED_TOOLS
17
19
  * so the architect knows exactly which calls will return SPEC_DRIFT_BLOCK
@@ -0,0 +1,68 @@
1
+ /**
2
+ * System render boundary (issue #2673).
3
+ *
4
+ * The final request boundary for the SYSTEM surface. The pinned host
5
+ * (@opencode-ai 1.18.3 — anomalyco/opencode@v1.18.3,
6
+ * packages/opencode/src/session/llm/request.ts, LLMRequestPrep.prepare)
7
+ * triggers `experimental.chat.system.transform` with `{ sessionID?, model }`
8
+ * and the SHARED `system` array, then coalesces only when
9
+ * `system.length > 2 && system[0] === header`, and materializes EVERY
10
+ * surviving entry as a separate `{role:'system'}` message ahead of the
11
+ * conversation. With plugin guidance entries present, every non-OAuth
12
+ * provider therefore receives exactly two system messages.
13
+ *
14
+ * Strict single-system providers (Qwen3.6/Gemma class — the documented
15
+ * v6.85.1 incident: "require exactly one `{role:'system'}` message at
16
+ * index 0") crash or silently degrade on that shape. An UNCONDITIONAL
17
+ * collapse is wrong (issue #1619): the host marks prompt-cache breakpoints
18
+ * on the first two system messages, so folding the stable base prompt
19
+ * together with per-request injections would move the breakpoint behind
20
+ * varying content and defeat caching for cache-capable providers.
21
+ *
22
+ * This module resolves the per-request rendering capability from the model
23
+ * the host hands the boundary and collapses ONLY for strict single-system
24
+ * models, IN PLACE (`length = 0` + `push` — the #1619 discipline: the host
25
+ * discards hook return values and reads its own array). Everything else is
26
+ * left byte-identical.
27
+ *
28
+ * Known limitation (plan-critic round 1, finding 1): host request paths that
29
+ * bypass `output.system` — OpenAI OAuth and workflow models consume the
30
+ * system surface via `options.instructions` — cannot be shaped by any plugin
31
+ * hook and are out of scope.
32
+ */
33
+ /** Rendering classes the boundary distinguishes. */
34
+ export type SystemRenderCapability = 'strict-single-system' | 'multi-system';
35
+ /** Bounded, observable result of one boundary application. */
36
+ export interface SystemRenderBoundaryResult {
37
+ capability: SystemRenderCapability;
38
+ entriesBefore: number;
39
+ entriesAfter: number;
40
+ collapsed: boolean;
41
+ }
42
+ /**
43
+ * Resolve the rendering capability for one request's model. Fail-open:
44
+ * anything unreadable or unknown resolves to `multi-system`, which leaves the
45
+ * array byte-identical (the pre-#2673 behavior), so the boundary can never
46
+ * regress a provider it does not positively know to be strict.
47
+ */
48
+ export declare function resolveSystemRenderCapability(model: unknown): SystemRenderCapability;
49
+ /**
50
+ * Apply the boundary to one request's system array, in place.
51
+ *
52
+ * Strict single-system models with more than one entry: empty-string entries
53
+ * are dropped, the rest are joined with a blank line (base prompt first —
54
+ * every producer appends after the host's pre-joined header), and the array is
55
+ * collapsed to exactly ONE entry via `length = 0` + `push`. Multi-system
56
+ * models: no mutation at all. Length ≤ 1: no-op. Never fabricates or reorders
57
+ * non-empty content.
58
+ */
59
+ export declare function applySystemRenderBoundary(model: unknown, system: string[]): SystemRenderBoundaryResult;
60
+ /**
61
+ * Hook factory for the `experimental.chat.system.transform` chain. Registered
62
+ * LAST (after every producer, including the role filter) so the shape is
63
+ * finalized once, after all pushes and prunes. Fail-open: any throw leaves the
64
+ * array untouched and logs non-fatally.
65
+ */
66
+ export declare function createSystemRenderBoundaryHook(): {
67
+ 'experimental.chat.system.transform': (input: unknown, output: unknown) => Promise<void>;
68
+ };