Compare commits

..

837 Commits

Author SHA1 Message Date
Peter Steinberger
542baa3b43 docs: document DM policy compatibility contracts 2026-06-01 22:43:57 -04:00
Peter Steinberger
72402b51c5 docs: document channel ingress SDK contracts 2026-06-01 22:40:58 -04:00
Peter Steinberger
df90aac6e2 docs: document ingress state contracts 2026-06-01 22:39:21 -04:00
Peter Steinberger
09796c6991 docs: document ingress decision contracts 2026-06-01 22:37:09 -04:00
Peter Steinberger
86ef2324a3 docs: document ingress sender gate contracts 2026-06-01 22:35:11 -04:00
Peter Steinberger
f1326d71ae docs: document ingress allowlist contracts 2026-06-01 22:33:46 -04:00
Peter Steinberger
cf6700486c docs: document ingress identity contracts 2026-06-01 22:32:06 -04:00
Peter Steinberger
537636b926 docs: document ingress access group contracts 2026-06-01 22:30:55 -04:00
Peter Steinberger
21648cf844 docs: document direct DM guard policy 2026-06-01 22:29:10 -04:00
Peter Steinberger
0841fe7d67 docs: document direct DM dispatch contracts 2026-06-01 22:27:53 -04:00
Peter Steinberger
7ecc9551ff docs: document channel DM access helpers 2026-06-01 22:26:12 -04:00
Peter Steinberger
5d423e5f1a docs: document direct DM access contracts 2026-06-01 22:25:03 -04:00
Peter Steinberger
fc459ad376 docs: document read-only channel command defaults 2026-06-01 22:22:42 -04:00
Peter Steinberger
abd52441c5 docs: document native command session targets 2026-06-01 22:21:24 -04:00
Peter Steinberger
33711a477b docs: document typing start skip semantics 2026-06-01 22:19:08 -04:00
Peter Steinberger
5edcff17c8 docs: document conversation label contracts 2026-06-01 22:17:17 -04:00
Peter Steinberger
a652a0529b docs: document account snapshot credential contracts 2026-06-01 22:15:47 -04:00
Peter Steinberger
d92f990126 docs: document outbound attachment staging contract 2026-06-01 22:13:21 -04:00
Peter Steinberger
5577442e84 docs: document base64 mime sniffing contract 2026-06-01 22:12:06 -04:00
Peter Steinberger
fe01495f8e docs: document channel inbound media root contracts 2026-06-01 22:10:13 -04:00
Peter Steinberger
c8d313f742 docs: document local media access contracts 2026-06-01 22:09:01 -04:00
Peter Steinberger
82466b33c5 docs: document media load option contracts 2026-06-01 22:07:02 -04:00
Peter Steinberger
480091b9ee docs: document media reference contracts 2026-06-01 22:05:32 -04:00
Peter Steinberger
5ea7e9d071 docs: document media read access contracts 2026-06-01 22:03:28 -04:00
Peter Steinberger
6c4626eca1 docs: document realtime voice provider resolver contracts 2026-06-01 22:01:37 -04:00
Peter Steinberger
b3f7436307 docs: document realtime voice activation contracts 2026-06-01 21:59:56 -04:00
Peter Steinberger
e327700c7d docs: document tool call repair contracts 2026-06-01 21:58:24 -04:00
Peter Steinberger
988b2e12a6 docs: document channel allowlist resolution contracts 2026-06-01 21:56:11 -04:00
Peter Steinberger
4cf2a2dd6f docs: document system run allowlist contracts 2026-06-01 21:54:58 -04:00
Peter Steinberger
b65bd56a79 docs: document media understanding output contracts 2026-06-01 21:52:15 -04:00
Peter Steinberger
bed2f620dd docs: document media generation catalog contracts 2026-06-01 21:50:36 -04:00
Peter Steinberger
eb1d0a3588 docs: document memory batch contracts 2026-06-01 21:48:10 -04:00
Peter Steinberger
fbdbbe9e97 docs: document llm event stream contracts 2026-06-01 21:46:22 -04:00
Peter Steinberger
782a360580 docs: document shell capture contracts 2026-06-01 21:44:31 -04:00
Peter Steinberger
0e9b65889b docs: document media boundary helpers 2026-06-01 21:42:55 -04:00
Peter Steinberger
914f0f9315 docs: document markdown chunking invariants 2026-06-01 21:40:42 -04:00
Peter Steinberger
1666686eba docs: document gateway connect error contracts 2026-06-01 21:39:25 -04:00
Peter Steinberger
1cfc23afb4 docs: document voice webhook ingress contracts 2026-06-01 21:37:35 -04:00
Peter Steinberger
5acb805f37 docs: document voice runtime boundary contracts 2026-06-01 21:36:02 -04:00
Peter Steinberger
8361b69ff6 docs: document voice response extraction contracts 2026-06-01 21:33:55 -04:00
Peter Steinberger
66c588e28f docs: document plivo callback flow contracts 2026-06-01 21:32:08 -04:00
Peter Steinberger
3d5c8b25a5 docs: document telnyx call setup contracts 2026-06-01 21:29:25 -04:00
Peter Steinberger
0ff9e3a88f docs: document twilio stream bridge contracts 2026-06-01 21:27:27 -04:00
Peter Steinberger
4774d26cec docs: document voice webhook security contracts 2026-06-01 21:25:10 -04:00
Peter Steinberger
0bff438190 docs: document voice call lifecycle helper contracts 2026-06-01 21:23:01 -04:00
Peter Steinberger
2fbddd65e6 docs: document realtime audio pacer contracts 2026-06-01 21:20:55 -04:00
Peter Steinberger
08ff5f7235 docs: document media stream helper contracts 2026-06-01 21:19:06 -04:00
Peter Steinberger
ca10f65280 docs: document voice stream frame contracts 2026-06-01 21:17:17 -04:00
Peter Steinberger
79627a02a5 docs: document voice model selection contracts 2026-06-01 21:15:27 -04:00
Peter Steinberger
b8cd4513a6 docs: document realtime voice context contracts 2026-06-01 21:13:37 -04:00
Peter Steinberger
cd003a688e docs: clarify voice mapping contracts 2026-06-01 21:11:54 -04:00
Peter Steinberger
7321e70b6f docs: document mock voice provider contracts 2026-06-01 21:09:57 -04:00
Peter Steinberger
691baa3054 docs: document voice test support contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
782de561c8 docs: document voice config compatibility contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
56c2ee2a77 docs: document voice exposure tunnel contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
7e59c8a48a docs: document twilio helper contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
2cb6f013ad docs: document voice shared type contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
c9417590c4 docs: document voice runtime lifecycle contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
dae769e4d1 docs: document voice response generator contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
fd36d510ac docs: document voice lifecycle timer contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
1b7da5d000 docs: document voice event processor contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
4730f05e78 docs: document voice outbound helper contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
859d01c919 docs: document telephony persistence contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
3549150d17 docs: document voice utility helper contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
bb7339fe24 docs: document realtime default instructions 2026-06-01 21:07:14 -04:00
Peter Steinberger
7033becd07 docs: document voice config helpers 2026-06-01 21:07:14 -04:00
Peter Steinberger
9326519c8d docs: document twilio provider state 2026-06-01 21:07:14 -04:00
Peter Steinberger
ace9d4c842 docs: document stale call reaper options 2026-06-01 21:07:14 -04:00
Peter Steinberger
8ccb15f813 docs: document realtime handler APIs 2026-06-01 21:07:14 -04:00
Peter Steinberger
85aa7cca7a docs: document realtime audio pacer contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
fd84a67e22 docs: document voice webhook server contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
c4b7e5ebd7 docs: tighten voice webhook security comments 2026-06-01 21:07:14 -04:00
Peter Steinberger
6878fb25f9 docs: document shared provider helpers 2026-06-01 21:07:14 -04:00
Peter Steinberger
da6e410690 docs: document plivo provider contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
7d013c1353 docs: document telnyx provider contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
f733a37db3 docs: document twilio provider helpers 2026-06-01 21:07:14 -04:00
Peter Steinberger
42fae37d9f docs: tighten voice provider API docs 2026-06-01 21:07:14 -04:00
Peter Steinberger
940e4e64ff docs: document voice manager context 2026-06-01 21:07:14 -04:00
Peter Steinberger
30bf7310a5 docs: document voice event processor 2026-06-01 21:07:14 -04:00
Peter Steinberger
f4952f3c42 docs: document voice initial message flow 2026-06-01 21:07:14 -04:00
Peter Steinberger
a0590e113a docs: document voice call snapshot persistence 2026-06-01 21:07:14 -04:00
Peter Steinberger
645f3025a7 docs: document voice restore invariants 2026-06-01 21:07:14 -04:00
Peter Steinberger
84398e8509 docs: document voice call type contracts 2026-06-01 21:07:14 -04:00
Peter Steinberger
89d694b33a docs: tighten voice tunnel comments 2026-06-01 21:07:14 -04:00
Peter Steinberger
2b411b0298 docs: document telephony voice selection 2026-06-01 21:07:14 -04:00
Peter Steinberger
f5c2e455c7 docs: tighten media stream comments 2026-06-01 21:07:14 -04:00
Peter Steinberger
6495eb8355 docs: document telephony tts adapter 2026-06-01 21:07:14 -04:00
Peter Steinberger
f3dccaa707 docs: document voice runtime transcript handling 2026-06-01 21:07:14 -04:00
Peter Steinberger
3830ae5f86 docs: tighten voice response comments 2026-06-01 21:07:14 -04:00
Peter Steinberger
955cc4a0fa docs: document realtime voice context budget 2026-06-01 21:07:14 -04:00
Peter Steinberger
e6049f5560 docs: document voice realtime path defaults 2026-06-01 21:07:14 -04:00
Peter Steinberger
b949cd8a63 docs: document realtime consult coordination 2026-06-01 21:07:14 -04:00
Peter Steinberger
eb68d9e8e7 docs: document realtime bridge lookup 2026-06-01 21:07:13 -04:00
Peter Steinberger
ee6b5eb51a docs: document voice webhook realtime guards 2026-06-01 21:07:13 -04:00
Peter Steinberger
57930933ce docs: document twilio twiml policy 2026-06-01 21:07:13 -04:00
Peter Steinberger
a9865297f9 docs: document plivo call control invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
8f952a1819 docs: document telnyx call control invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
ef7f54e1db docs: document twilio stream cleanup 2026-06-01 21:07:13 -04:00
Peter Steinberger
1bb275b4af docs: document voice provider contracts 2026-06-01 21:07:13 -04:00
Peter Steinberger
8f8fba66e3 docs: document voice lifecycle cleanup 2026-06-01 21:07:13 -04:00
Peter Steinberger
3663b216ea docs: document voice outbound invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
082e0e1e74 docs: document voice twiml helpers 2026-06-01 21:07:13 -04:00
Peter Steinberger
029eae8d4d docs: document voice event idempotency 2026-06-01 21:07:13 -04:00
Peter Steinberger
7e91337292 docs: document voice call store ordering 2026-06-01 21:07:13 -04:00
Peter Steinberger
5cddc8617b docs: document tts voice lookup 2026-06-01 21:07:13 -04:00
Peter Steinberger
b29bc49452 docs: document telephony audio exports 2026-06-01 21:07:13 -04:00
Peter Steinberger
ab0c86079c docs: document telephony tts policy 2026-06-01 21:07:13 -04:00
Peter Steinberger
7cc4b178da docs: document realtime audio pacer invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
8e21b7b791 docs: document stream frame adapter invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
70c180de5c docs: document webhook replay invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
3ab4ff1970 docs: document voice webhook lifecycle 2026-06-01 21:07:13 -04:00
Peter Steinberger
b80b736bec docs: document voice config invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
902a7f2e40 docs: document realtime consult invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
fd66568e9c docs: document media stream invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
cb50517168 docs: document twilio provider invariants 2026-06-01 21:07:13 -04:00
Peter Steinberger
461d582bf0 docs: document voice cli helpers 2026-06-01 21:07:13 -04:00
Peter Steinberger
df403be1a6 docs: document voice response sanitizing 2026-06-01 21:07:13 -04:00
Peter Steinberger
ddec7f7583 docs: document voice runtime setup 2026-06-01 21:07:13 -04:00
Peter Steinberger
f675c85e97 docs: document voice core bridge 2026-06-01 21:07:13 -04:00
Peter Steinberger
935e31e1f7 docs: document voice webhook security guards 2026-06-01 21:07:13 -04:00
Peter Steinberger
7a2312ed3b docs: document stale call reaper 2026-06-01 21:07:13 -04:00
Peter Steinberger
22408ff4ca docs: document voice mock provider 2026-06-01 21:07:13 -04:00
Peter Steinberger
a293e4ea36 docs: document voice outbound helpers 2026-06-01 21:07:13 -04:00
Peter Steinberger
d1d363f02c docs: document voice runtime utilities 2026-06-01 21:07:13 -04:00
Peter Steinberger
181937aa79 docs: document voice twiml helpers 2026-06-01 21:07:13 -04:00
Peter Steinberger
b05a9e64e7 docs: document voice continue operations 2026-06-01 21:07:13 -04:00
Peter Steinberger
052b9caa4c docs: document realtime voice context helpers 2026-06-01 21:07:13 -04:00
Peter Steinberger
b8cd038b53 docs: document telephony tts helpers 2026-06-01 21:07:13 -04:00
Peter Steinberger
807a78d729 docs: document voice response helpers 2026-06-01 21:07:13 -04:00
Peter Steinberger
3ba3706e7b docs: document voice config compatibility 2026-06-01 21:07:13 -04:00
Peter Steinberger
f8fbeca3b0 docs: document webhook exposure checks 2026-06-01 21:07:13 -04:00
Peter Steinberger
ecfdc422ff docs: document telnyx provider flow 2026-06-01 21:07:13 -04:00
Peter Steinberger
b2d4015559 docs: document plivo provider flow 2026-06-01 21:07:13 -04:00
Peter Steinberger
38b3f872ec docs: document twilio provider helpers 2026-06-01 21:07:13 -04:00
Peter Steinberger
30342d1ff1 docs: document voice provider helpers 2026-06-01 21:07:13 -04:00
Peter Steinberger
5772ce0bd2 docs: document voice event state flow 2026-06-01 21:07:12 -04:00
Peter Steinberger
8b615e7bdd docs: document voice call timers 2026-06-01 21:07:12 -04:00
Peter Steinberger
74a6828e65 docs: document voice call record store 2026-06-01 21:07:12 -04:00
Peter Steinberger
6f885c9e69 docs: document voice manager helpers 2026-06-01 21:07:12 -04:00
Peter Steinberger
606f914786 docs: document voice helper boundaries 2026-06-01 21:07:12 -04:00
Peter Steinberger
0a37307b9e docs: document tailscale exposure helpers 2026-06-01 21:07:12 -04:00
Peter Steinberger
a45cf4aa3d docs: document stream frame adapters 2026-06-01 21:07:12 -04:00
Peter Steinberger
627f937126 docs: document realtime audio pacing 2026-06-01 21:07:12 -04:00
Peter Steinberger
87a51de824 docs: document voice config merge guard 2026-06-01 21:07:12 -04:00
Peter Steinberger
cf7aa53974 docs: document voice mapping passthrough 2026-06-01 21:07:12 -04:00
Peter Steinberger
1dd7dcbb8b docs: document telephony audio chunking 2026-06-01 21:07:12 -04:00
Peter Steinberger
1c7bc0a70c docs: document pair loop guard invariants 2026-06-01 21:07:12 -04:00
Peter Steinberger
2eef5e64ea docs: document string entry coercion 2026-06-01 21:07:12 -04:00
Peter Steinberger
44030e6a70 docs: document async lock contract 2026-06-01 21:07:12 -04:00
Peter Steinberger
b4e3680c15 docs: document slack external menu tokens 2026-06-01 21:07:12 -04:00
Peter Steinberger
f5fed728d7 docs: document thread binding contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
7e1c1293d2 docs: document ssrf pinned lookup contract 2026-06-01 21:07:12 -04:00
Peter Steinberger
2ba9dcc4d1 docs: document local media access guardrails 2026-06-01 21:07:12 -04:00
Peter Steinberger
c4b2e5ede1 docs: document media mime helper contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
9b9481466b docs: document tcp port config parsing 2026-06-01 21:07:12 -04:00
Peter Steinberger
e887319d03 docs: document fetch runtime proxy preset 2026-06-01 21:07:12 -04:00
Peter Steinberger
19cd359980 docs: document scp host normalization contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
6d6f800b71 docs: document provider operation retry contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
89e289bebf docs: document image asset helper contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
887da616a3 docs: document delivery queue runtime contract 2026-06-01 21:07:12 -04:00
Peter Steinberger
6f7111af77 docs: document provider auth runtime contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
fb184b23d8 docs: document provider catalog projection contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
3da99c9c5d docs: document provider stream family contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
4a5250bbd0 docs: document provider stream wrapper contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
a01dad0467 docs: document provider replay family contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
3e0f205e21 docs: remove provider web facade header comments 2026-06-01 21:07:12 -04:00
Peter Steinberger
7e89d1549c docs: document web search provider contract fields 2026-06-01 21:07:12 -04:00
Peter Steinberger
7fe48606d9 docs: document provider selection contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
c9dba69584 docs: document provider enable result contract 2026-06-01 21:07:12 -04:00
Peter Steinberger
04e960542d docs: document oauth provider auth result helper 2026-06-01 21:07:12 -04:00
Peter Steinberger
37d68a2c26 docs: clarify outbound text chunking contract 2026-06-01 21:07:12 -04:00
Peter Steinberger
4f75d03f98 docs: document reply payload delivery helpers 2026-06-01 21:07:12 -04:00
Peter Steinberger
c56f0ad6e8 docs: document outbound media load options 2026-06-01 21:07:12 -04:00
Peter Steinberger
e7685a3442 docs: document channel policy helper contracts 2026-06-01 21:07:12 -04:00
Peter Steinberger
0915a43ae3 docs: document browser profile facade contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
40bc655224 docs: document agent media payload contract 2026-06-01 21:07:11 -04:00
Peter Steinberger
c4c3649a69 docs: document browser control auth facade 2026-06-01 21:07:11 -04:00
Peter Steinberger
982d81f613 docs: document browser cdp url helpers 2026-06-01 21:07:11 -04:00
Peter Steinberger
cd01bd00fc docs: document allow-from helper contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
133a0a3d1b docs: document approval approver resolution 2026-06-01 21:07:11 -04:00
Peter Steinberger
542c2a667c docs: document approval auth helper contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
eaa9da2d81 docs: document approval client helper contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
7c7c52640c docs: document approval delivery capability contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
7106593349 docs: document native approval routing contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
284c316fde docs: document channel lifecycle contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
f4a049d571 docs: document approval reaction runtime contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
c7d3d09345 docs: document plugin config runtime helpers 2026-06-01 21:07:11 -04:00
Peter Steinberger
f43e8eac30 docs: document provider onboard merge contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
daa6405784 docs: document provider tool schema compat 2026-06-01 21:07:11 -04:00
Peter Steinberger
63d1572d40 docs: document channel route shape contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
6d3d1b4449 docs: document channel ingress SDK contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
5198edc051 docs: document group access decision contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
776121bf27 docs: document session transcript hit contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
321bd8734d docs: document allowlist config edit contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
f5c3fc2033 docs: document session visibility contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
eb925afda2 docs: document channel config adapter options 2026-06-01 21:07:11 -04:00
Peter Steinberger
66dccf2111 docs: document channel config write policy shapes 2026-06-01 21:07:11 -04:00
Peter Steinberger
fe976b19f5 docs: document gateway config write contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
c306bf9986 docs: document model auth status payloads 2026-06-01 21:07:11 -04:00
Peter Steinberger
c9c71965d2 docs: document talk realtime helper contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
7e3832cb72 docs: document webchat reply media normalization 2026-06-01 21:07:11 -04:00
Peter Steinberger
a71d83f1ea docs: document webchat media helper contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
d14c004124 docs: document managed image attachment limits 2026-06-01 21:07:11 -04:00
Peter Steinberger
87881bb3f8 docs: document session history state payloads 2026-06-01 21:07:11 -04:00
Peter Steinberger
f529019f71 docs: document session kill http contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
ad230f0072 docs: document openai embeddings endpoint contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
57c15073bd docs: document openai models endpoint contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
3d4a170acd docs: document openai compat error contracts 2026-06-01 21:07:11 -04:00
Peter Steinberger
70954c5ef1 docs: document responses prompt conversion 2026-06-01 21:07:11 -04:00
Peter Steinberger
bc1ceb11f5 docs: document responses output item helpers 2026-06-01 21:07:11 -04:00
Peter Steinberger
5c5ead97f2 docs: document openai tool choice constraints 2026-06-01 21:07:11 -04:00
Peter Steinberger
5a451e4b29 docs: document openai http request context helpers 2026-06-01 21:07:11 -04:00
Peter Steinberger
74b7668ad7 docs: document gateway http auth contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
fd820654f6 docs: document gateway post json endpoint options 2026-06-01 21:07:10 -04:00
Peter Steinberger
91bc6d2f75 docs: document shared gateway http responses 2026-06-01 21:07:10 -04:00
Peter Steinberger
c8f2b9864a docs: document gateway client readiness adapter 2026-06-01 21:07:10 -04:00
Peter Steinberger
845ae136e2 docs: document control ui link resolution 2026-06-01 21:07:10 -04:00
Peter Steinberger
8bad7e3c5f docs: document control ui shared url helpers 2026-06-01 21:07:10 -04:00
Peter Steinberger
5d916a47e0 docs: document gateway lane concurrency contract 2026-06-01 21:07:10 -04:00
Peter Steinberger
ce6443d6c2 docs: document gateway client bootstrap contract 2026-06-01 21:07:10 -04:00
Peter Steinberger
a4f270e960 docs: document gateway auth mode validation message 2026-06-01 21:07:10 -04:00
Peter Steinberger
25c19e98d9 docs: document gateway connection auth options 2026-06-01 21:07:10 -04:00
Peter Steinberger
be1d0283f7 docs: document gateway probe target contract 2026-06-01 21:07:10 -04:00
Peter Steinberger
6ea9de0ba9 docs: document gateway probe auth source contract 2026-06-01 21:07:10 -04:00
Peter Steinberger
9f9b233262 docs: document gateway dedupe entry contract 2026-06-01 21:07:10 -04:00
Peter Steinberger
befc96d445 docs: document startup task result contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
9de16d960e docs: document hook allowlist policy contract 2026-06-01 21:07:10 -04:00
Peter Steinberger
ac3fed0b90 docs: document channel health policy contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
8856a3e63f docs: document control UI bootstrap contract 2026-06-01 21:07:10 -04:00
Peter Steinberger
8348c97336 docs: document plugin reload target contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
a1e7b5c2af docs: document MCP loopback runtime cache contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
93d27fd090 docs: document MCP schema export contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
ae1d58e2e2 docs: document MCP loopback protocol contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
73d7448920 docs: document websocket close reason contract 2026-06-01 21:07:10 -04:00
Peter Steinberger
35e8f4aeb5 docs: document gateway method helper contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
9e8e5f8b8e docs: document node wake state contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
f5ee1d71a0 docs: document agent helper API contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
a1ac0e892c docs: document RPC attachment normalization contract 2026-06-01 21:07:10 -04:00
Peter Steinberger
5554d29db7 docs: document gateway request type contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
ba9f3be82b docs: document plugin route context contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
c4618bd859 docs: document hook request replay contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
47c68db395 docs: document gateway event loop health contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
14d9a9d184 docs: document gateway health state refresh contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
ad3e74f433 docs: document gateway chat state registry contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
5869473dc3 docs: document gateway model pricing cache state contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
005da3bfc0 docs: document gateway active session shutdown tracker contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
c3042c8a53 docs: document gateway run session key lookup contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
595df6e4fc docs: document gateway session event broadcast contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
80a9f9171d docs: document gateway transcript key ownership contracts 2026-06-01 21:07:10 -04:00
Peter Steinberger
a85df5a2fe docs: document gateway session kill HTTP contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
3d39143851 docs: document gateway session mutation cleanup contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
578258775e docs: document gateway transcript reader contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
9cbe85f2e6 docs: document gateway transcript index contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
035ca4106d docs: document gateway session compaction checkpoint contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
ace66d9276 docs: document gateway session lineage helper contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
2e856ecf6d docs: document gateway session lifecycle state contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
bb5a2a6c4b docs: document gateway session reset lifecycle contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
e3652a0541 docs: document gateway sessions patch contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
9ac9c4014e docs: document gateway session transcript file contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
a059c5e359 docs: document gateway session store key contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
d1cc90f991 docs: document gateway session transcript key contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
bbf74df187 docs: document gateway live chat projection contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
9f56655cba docs: document gateway chat abort contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
32cf26edb9 docs: document gateway chat attachment contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
38219de4a8 docs: document gateway chat sanitize contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
74de22592f docs: document gateway chat display projection contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
49d563823e docs: document gateway openai chat helper contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
55c26f453a docs: document gateway openai compatibility contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
39dcc60cf3 docs: document gateway openresponses helper contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
74b77e746c docs: document gateway openresponses continuity contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
b1562cf30e docs: document gateway openai embeddings contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
f46921dbc1 docs: document gateway openai models contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
2873917a67 docs: document gateway http compatibility utility contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
45e30ed8cb docs: document gateway http auth trust contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
343901eed2 docs: document gateway http endpoint helper contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
39987341ef docs: document gateway http common contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
e968912c0a docs: document gateway maintenance timer contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
a8946ceaa2 docs: document gateway runtime startup service contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
a38f8a7727 docs: document gateway runtime service contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
937c81d269 docs: document gateway runtime state contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
f741019d47 docs: document gateway reload handler contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
f3a66be5db docs: document gateway runtime config contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
1b3d42a5bf docs: document gateway server hook facade contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
6920c31b59 docs: document gateway hook request handler contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
bff56270f7 docs: document gateway hook mapping contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
16a2e9797c docs: document gateway hook helper contracts 2026-06-01 21:07:09 -04:00
Peter Steinberger
3580dcc2c5 docs: document gateway control reply suppression 2026-06-01 21:07:09 -04:00
Peter Steinberger
77cbf0bbe7 docs: document gateway local request context 2026-06-01 21:07:08 -04:00
Peter Steinberger
be604a74cc docs: document gateway control ui routing contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
d3645e9a09 docs: document gateway connection helpers 2026-06-01 21:07:08 -04:00
Peter Steinberger
f430f7b35f docs: document gateway shutdown env helpers 2026-06-01 21:07:08 -04:00
Peter Steinberger
5c8ad36c96 docs: document gateway boot echo guard contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
9cf089add3 docs: document gateway config reload contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
2f42e28822 docs: document gateway agent list contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
0dfecf5d38 docs: document gateway cli session history contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
0cf207ff69 docs: document gateway chat display projection 2026-06-01 21:07:08 -04:00
Peter Steinberger
34f5d18646 docs: document gateway chat attachment contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
894f76f9b2 docs: document gateway chat sanitize contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
cf2f010c11 docs: document gateway agent prompt helpers 2026-06-01 21:07:08 -04:00
Peter Steinberger
9dec94077c docs: document gateway channel health contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
46fdc874ff docs: document gateway install auth policy 2026-06-01 21:07:08 -04:00
Peter Steinberger
07cfeb8825 docs: document gateway auth token resolution 2026-06-01 21:07:08 -04:00
Peter Steinberger
748d15a7e8 docs: document gateway auth rate limiter contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
44a41c983d docs: document gateway chat state registries 2026-06-01 21:07:08 -04:00
Peter Steinberger
5991581624 docs: document gateway health state contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
6462d5711f docs: document gateway plugin http path contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
da00d620c8 docs: document gateway plugin http auth contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
5e2913b8f2 docs: document gateway http auth contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
35efd98a8d docs: document websocket auth policy contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
a74d094a92 docs: document gateway auth probe contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
8501e1ab49 docs: document hosted plugin url contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
1b35fd6042 docs: document live chat projection contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
f199a3ec4a docs: document gateway cli backend live helpers 2026-06-01 21:07:08 -04:00
Peter Steinberger
8b445c0b1c docs: document gateway run lifecycle contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
31cb21dc80 docs: document gateway cli registration contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
9141dac9ff docs: document gateway cli rpc contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
641c8d3e8f docs: document cli route parser contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
48ef13f3f9 docs: document message cli subcommand contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
f002c11263 docs: document message cli helper contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
ed98cf4072 docs: document program runtime helper contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
06bbffa56b docs: document program command descriptor contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
b9dd6e2176 docs: document nodes cli command contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
84941d8079 docs: document nodes cli rpc contracts 2026-06-01 21:07:08 -04:00
Peter Steinberger
7c71652b97 docs: document update command restore contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
68d189aee2 docs: document update cli helper contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
de62123e4d docs: document daemon shared helper contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
ffbfcf7ede docs: document CLI startup runtime helpers 2026-06-01 21:07:07 -04:00
Peter Steinberger
af78281011 docs: document config set helper contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
ea0411257d docs: document CLI utility helper contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
bcd4e91a26 docs: document CLI banner contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
03ccc1860d docs: document CLI completion contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
1a7ff3c75c docs: document CLI command policy contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
657355d2b0 docs: document CLI invocation display helpers 2026-06-01 21:07:07 -04:00
Peter Steinberger
2b444e9b43 docs: document CLI argv helpers 2026-06-01 21:07:07 -04:00
Peter Steinberger
c603b71d40 docs: document CLI root option helpers 2026-06-01 21:07:07 -04:00
Peter Steinberger
ac33c605cc docs: document approval handler runtime contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
df13f8aa6d docs: document command carrier exports 2026-06-01 21:07:07 -04:00
Peter Steinberger
590b653d8d docs: document offsetless datetime parsing 2026-06-01 21:07:07 -04:00
Peter Steinberger
f126a99773 docs: document duration formatter contract 2026-06-01 21:07:07 -04:00
Peter Steinberger
d44e59b737 docs: document lsof resolver contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
dee8f41d99 docs: document port diagnostics contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
3242949658 docs: document binary detection contract 2026-06-01 21:07:07 -04:00
Peter Steinberger
b1375ef40c docs: document git root contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
0f3ef7d6e7 docs: document package json contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
0ed2a3f6f4 docs: document runtime status contract 2026-06-01 21:07:07 -04:00
Peter Steinberger
1404b0e87e docs: document WebSocket raw data contract 2026-06-01 21:07:07 -04:00
Peter Steinberger
738bcde966 docs: document secure random contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
93f04f1edd docs: document JSON byte contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
a47f3b240d docs: document path prepend contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
e90dea78a8 docs: document port probe contract 2026-06-01 21:07:07 -04:00
Peter Steinberger
03b1d06980 docs: document install target contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
78638ba4bb docs: document update channel contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
c4fcafcf8e docs: document update check contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
e4c1182789 docs: document update restart sentinel handoff 2026-06-01 21:07:07 -04:00
Peter Steinberger
1cba4300a8 docs: document restart sentinel continuations 2026-06-01 21:07:07 -04:00
Peter Steinberger
93084f6073 docs: document entrypoint detection 2026-06-01 21:07:07 -04:00
Peter Steinberger
f4d53265da docs: document npm registry spec contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
c77e69b27b docs: document secret input normalization 2026-06-01 21:07:07 -04:00
Peter Steinberger
b9fd6d96cc docs: document inline directive helpers 2026-06-01 21:07:07 -04:00
Peter Steinberger
1fd4e90463 docs: document delivery context helpers 2026-06-01 21:07:07 -04:00
Peter Steinberger
ae62e30ae7 docs: document message channel helpers 2026-06-01 21:07:07 -04:00
Peter Steinberger
7b11b3f782 docs: document shared utils contracts 2026-06-01 21:07:07 -04:00
Peter Steinberger
0531beaf52 docs: document ssrf contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
355c1354e9 docs: document local-origin bypass contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
064ac94744 docs: document proxy fetch contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
b5f9cb6151 docs: document runtime fetch contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
5e03331d19 docs: document fetch compatibility contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
75b6ebc524 docs: document web push contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
f3a35fb09b docs: document Homebrew resolution contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
7634b15b81 docs: document gateway discovery targets 2026-06-01 21:07:06 -04:00
Peter Steinberger
5122e14c6b docs: document gateway process contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
2efa068f0b docs: document host env security contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
0a59b1319d docs: document restart sentinel contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
222e6f5c60 docs: document port diagnostics contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
cdd8bc862b docs: document heartbeat cooldown contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
762ad43b26 docs: document OpenAI tool choice contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
87c1417dab docs: document temp directory contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
71c473a539 docs: document executable path contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
5fa93a09d6 docs: document MCP loopback contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
e5b9d3c66b docs: document infra utility contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
4c12cc9da1 docs: document npm registry spec contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
0df70f2f9a docs: document gateway shared auth contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
ccbfcd3337 docs: document gateway method scope contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
a564c7dd82 docs: document agent stream safety contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
79c2c69ef1 docs: document CLI session reuse contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
c76863ec8a docs: document node pairing surface contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
297d95b94c docs: document node pairing persistence contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
751eabc9c4 docs: document gateway security helper contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
89d868733a docs: document gateway update mutation contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
1ea0f55fd6 docs: document node wake rpc contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
7f2ab82410 docs: document node approval pairing contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
2fc6ef9cd0 docs: document gateway node registry contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
e90fb1feba docs: document gateway startup runtime contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
7398020b1f docs: document gateway startup config contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
3ce0abff1a docs: document gateway talk session registry contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
71f9d68616 docs: document gateway talk relay contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
eae814770c docs: document gateway session history contracts 2026-06-01 21:07:06 -04:00
Peter Steinberger
9660aab819 docs: document gateway subagent lineage contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
a1f602765e docs: document session lifecycle event contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
243094a9e2 docs: document gateway active session shutdown contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
aa63357a88 docs: document gateway transcript ownership contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
7aff176ead docs: document gateway session patch contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
c7ac8c0b58 docs: document gateway auth resolution contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
ac29cbccc1 docs: document gateway auth secret materialization 2026-06-01 21:07:05 -04:00
Peter Steinberger
ab4ff72e05 docs: document gateway explicit connection policy 2026-06-01 21:07:05 -04:00
Peter Steinberger
1fd3e8a536 docs: document control ui routing contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
b57eb93646 docs: document gateway utility contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
188dbfbbbd docs: document gateway run session key contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
279a3a00bb docs: document node invoke sanitizer contract 2026-06-01 21:07:05 -04:00
Peter Steinberger
51ae46319a docs: document gateway rate limit contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
d9ef964c42 docs: document gateway request context contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
d47eeda8f9 docs: document gateway shared auth generation 2026-06-01 21:07:05 -04:00
Peter Steinberger
5eaba4ce10 docs: document gateway session key contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
ff4a7f7e50 docs: document gateway credential secret contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
8a6472b4b0 docs: document gateway method contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
9091d44ad2 docs: document plugin main api contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
5f2a996550 docs: document plugin node service contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
d096e788aa docs: document plugin command gateway contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
67a8225f3b docs: document speech realtime provider contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
3932238405 docs: document provider plugin tail contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
8dd47022bc docs: document provider plugin identity contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
429082e106 docs: document provider setup prompt contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
97c9ef2bad docs: document provider runtime hook contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
14b88e5193 docs: document provider catalog type contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
55d0eebf38 docs: document provider auth method contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
32fe56d9b5 docs: document provider auth type contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
fb2e814383 docs: document migration provider type contracts 2026-06-01 21:07:05 -04:00
Peter Steinberger
6d4d2d662a docs: document migrate prompt option APIs 2026-06-01 21:07:05 -04:00
Peter Steinberger
3c1d353e33 docs: document migrate command entrypoint 2026-06-01 21:07:05 -04:00
Peter Steinberger
85d0bd8c75 docs: document migrate provider context helpers 2026-06-01 21:07:05 -04:00
Peter Steinberger
ba37ac552c docs: document migrate output helpers 2026-06-01 21:07:05 -04:00
Peter Steinberger
ea4b3fd235 docs: document migrate selection helpers 2026-06-01 21:07:05 -04:00
Peter Steinberger
233a68e820 docs: document plugin SDK migration runtime 2026-06-01 21:07:05 -04:00
Peter Steinberger
6b4d308045 docs: document plugin SDK migration helpers 2026-06-01 21:07:05 -04:00
Peter Steinberger
c7befdc0e0 docs: document provider tool schema compatibility 2026-06-01 21:07:05 -04:00
Peter Steinberger
06e70c8ea5 docs: document outbound text chunking 2026-06-01 21:07:04 -04:00
Peter Steinberger
d7dedeb427 docs: document channel route identity helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
6e53296c56 docs: document inbound debounce policy 2026-06-01 21:07:04 -04:00
Peter Steinberger
5bd5cbcc3e docs: document channel config matching helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
e3647f0c03 docs: document plugin host cleanup timeout 2026-06-01 21:07:04 -04:00
Peter Steinberger
8ed427971d docs: document provider catalog helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
1cbf3a9114 docs: document channel model override resolution 2026-06-01 21:07:04 -04:00
Peter Steinberger
37b3dd4008 docs: document channel config helper contracts 2026-06-01 21:07:04 -04:00
Peter Steinberger
4712707798 docs: document account snapshot field projection 2026-06-01 21:07:04 -04:00
Peter Steinberger
041d699c13 docs: document thread binding policy helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
090d549a17 docs: document channel target parsing contracts 2026-06-01 21:07:04 -04:00
Peter Steinberger
ce00659782 docs: document direct dm access bridge 2026-06-01 21:07:04 -04:00
Peter Steinberger
fc35ea8283 docs: document provider catalog text projection 2026-06-01 21:07:04 -04:00
Peter Steinberger
7b3803a4a6 docs: document gateway startup plugin scopes 2026-06-01 21:07:04 -04:00
Peter Steinberger
68ce3a2d38 docs: document embedding provider runtime lookup 2026-06-01 21:07:04 -04:00
Peter Steinberger
b9910b87a0 docs: document memory embedding provider runtime 2026-06-01 21:07:04 -04:00
Peter Steinberger
6c67c766ce docs: document memory runtime helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
4b2ccbf421 docs: document bundle config helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
05c5d5a23d docs: document plugin config state 2026-06-01 21:07:04 -04:00
Peter Steinberger
39daf6e335 docs: document plugin activation context 2026-06-01 21:07:04 -04:00
Peter Steinberger
b4cce6da21 docs: document trusted tool policy flow 2026-06-01 21:07:04 -04:00
Peter Steinberger
458d49e8e4 docs: document provider install catalog 2026-06-01 21:07:04 -04:00
Peter Steinberger
36dd1f902e docs: document web search provider helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
6d88c9416d docs: document web fetch provider helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
ae3f999856 docs: document web provider resolution 2026-06-01 21:07:04 -04:00
Peter Steinberger
eac2c3db00 docs: document manifest model suppression 2026-06-01 21:07:04 -04:00
Peter Steinberger
e60a8bac79 docs: document manifest owner policy 2026-06-01 21:07:04 -04:00
Peter Steinberger
30a5337315 docs: document manifest tool availability 2026-06-01 21:07:04 -04:00
Peter Steinberger
8382859716 docs: document plugin scheduled turn contracts 2026-06-01 21:07:04 -04:00
Peter Steinberger
4e004384e0 docs: document uninstall helper contracts 2026-06-01 21:07:04 -04:00
Peter Steinberger
79074b7ee9 docs: document effective plugin id resolution 2026-06-01 21:07:04 -04:00
Peter Steinberger
ab1415b62d docs: document optional plugin manifest rule 2026-06-01 21:07:04 -04:00
Peter Steinberger
8359e618ed docs: document web search credential detection 2026-06-01 21:07:04 -04:00
Peter Steinberger
86c3de42cf docs: document hook agent channel context 2026-06-01 21:07:04 -04:00
Peter Steinberger
44413914a2 docs: document host hook cleanup timeout 2026-06-01 21:07:04 -04:00
Peter Steinberger
84d2aff5fb docs: document agent tool result middleware helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
4354045ce1 docs: document plugin source display 2026-06-01 21:07:04 -04:00
Peter Steinberger
fa305ad2e7 docs: document plugin control plane context 2026-06-01 21:07:04 -04:00
Peter Steinberger
81d30ae3c8 docs: document plugin scope helpers 2026-06-01 21:07:04 -04:00
Peter Steinberger
b460cae176 docs: document provider auth input mode 2026-06-01 21:07:04 -04:00
Peter Steinberger
ab3b585601 docs: document installed plugin index store paths 2026-06-01 21:07:04 -04:00
Peter Steinberger
8061edd972 docs: document plugin HTTP path normalization 2026-06-01 21:07:04 -04:00
Peter Steinberger
88b853cf7b docs: document provider config owner hints 2026-06-01 21:07:03 -04:00
Peter Steinberger
b8b85fb402 docs: document plugin conversation binding runtime 2026-06-01 21:07:03 -04:00
Peter Steinberger
a074ac6382 docs: document interactive registry helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
1a8e1f25ae docs: document plugin tool descriptor cache 2026-06-01 21:07:03 -04:00
Peter Steinberger
26bde4dcbd docs: document plugin cache primitives 2026-06-01 21:07:03 -04:00
Peter Steinberger
f97c5946b7 docs: document plugin root cache inputs 2026-06-01 21:07:03 -04:00
Peter Steinberger
3fb6b22133 docs: document package entrypoint candidates 2026-06-01 21:07:03 -04:00
Peter Steinberger
8ea2dc7075 docs: document bundled public surface resolution 2026-06-01 21:07:03 -04:00
Peter Steinberger
393ac2a110 docs: document host hook JSON boundary 2026-06-01 21:07:03 -04:00
Peter Steinberger
ce908ef258 docs: document setup wizard flow 2026-06-01 21:07:03 -04:00
Peter Steinberger
bd549a1a02 docs: clarify configured binding matching 2026-06-01 21:07:03 -04:00
Peter Steinberger
251d1a3c33 docs: document stateful target driver contract 2026-06-01 21:07:03 -04:00
Peter Steinberger
fb5c0da417 docs: document configured binding consumer contract 2026-06-01 21:07:03 -04:00
Peter Steinberger
700003d25c docs: document configured binding skips 2026-06-01 21:07:03 -04:00
Peter Steinberger
5f4fbb1639 docs: document chat target prefix helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
4c0a838b34 docs: document status approval utilities 2026-06-01 21:07:03 -04:00
Peter Steinberger
281e503a18 docs: document channel module loader 2026-06-01 21:07:03 -04:00
Peter Steinberger
091df1fddc docs: document config write ambiguity 2026-06-01 21:07:03 -04:00
Peter Steinberger
0826b75e9b docs: document group policy warning helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
79fae8a163 docs: document channel utility entrypoints 2026-06-01 21:07:03 -04:00
Peter Steinberger
521861192b docs: document status issue helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
c94710b5f4 docs: document setup wizard type contracts 2026-06-01 21:07:03 -04:00
Peter Steinberger
ccc4053def docs: document channel adapter type contracts 2026-06-01 21:07:03 -04:00
Peter Steinberger
cb72a1ce2d docs: document channel plugin type contracts 2026-06-01 21:07:03 -04:00
Peter Steinberger
ca23a63de1 docs: document outbound config types 2026-06-01 21:07:03 -04:00
Peter Steinberger
b6288593c2 docs: document setup wizard helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
817f220aaa docs: document setup promotion helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
06502bc9ad docs: document bundled read helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
3e74cc4d1a docs: document approval config schema helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
ffa248a523 docs: document dm pairing helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
7a4a814a3d docs: document channel runtime helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
5948160245 docs: document media helper APIs 2026-06-01 21:07:03 -04:00
Peter Steinberger
2656a8feca docs: document threading target helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
1d87ef5a86 docs: document channel state helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
ba8abd1357 docs: document channel catalog helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
4fabaea49b docs: document bundled channel loader 2026-06-01 21:07:03 -04:00
Peter Steinberger
64b684e187 docs: document channel registry helpers 2026-06-01 21:07:03 -04:00
Peter Steinberger
3cbf0d1faa docs: document outbound loader APIs 2026-06-01 21:07:03 -04:00
Peter Steinberger
e088d2cbbe docs: document presentation limit invariants 2026-06-01 21:07:02 -04:00
Peter Steinberger
75ba474c7d docs: document outbound helper APIs 2026-06-01 21:07:02 -04:00
Peter Steinberger
93ff68940d docs: document message action helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
0d676cfd48 docs: document message tool APIs 2026-06-01 21:07:02 -04:00
Peter Steinberger
c0026f1811 docs: document message action discovery 2026-06-01 21:07:02 -04:00
Peter Steinberger
112ce219fb docs: document stateful target builtins 2026-06-01 21:07:02 -04:00
Peter Steinberger
937a5a1ee1 docs: document configured binding consumers 2026-06-01 21:07:02 -04:00
Peter Steinberger
72edfa235e docs: document binding public APIs 2026-06-01 21:07:02 -04:00
Peter Steinberger
58ba60e14e docs: document stateful target drivers 2026-06-01 21:07:02 -04:00
Peter Steinberger
5782a24b97 docs: document configured binding registry 2026-06-01 21:07:02 -04:00
Peter Steinberger
b03998ae37 docs: document binding routing helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
18bf52fc94 docs: document directory adapter helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
026ec61336 docs: document directory config helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
c01cd303b2 docs: document setup wizard prompt helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
be1009ea34 docs: document setup wizard policy helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
eaa1af3e56 docs: document setup wizard helper parsing 2026-06-01 21:07:02 -04:00
Peter Steinberger
f4833592b3 docs: document setup wizard delegation 2026-06-01 21:07:02 -04:00
Peter Steinberger
577636d728 docs: document setup promotion keys 2026-06-01 21:07:02 -04:00
Peter Steinberger
a827663a5b docs: document setup promotion helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
07ca2b6871 docs: document plugin config helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
5f431f4fcd docs: document config write wrappers 2026-06-01 21:07:02 -04:00
Peter Steinberger
da2d32c5f8 docs: document config write policy helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
9ab59b4953 docs: document channel account helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
9e5dace9d3 docs: document account action gate 2026-06-01 21:07:02 -04:00
Peter Steinberger
544245826c docs: document target resolver helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
d275f33bd5 docs: document channel route helper invariants 2026-06-01 21:07:02 -04:00
Peter Steinberger
9df20de599 docs: document channel target parser contracts 2026-06-01 21:07:02 -04:00
Peter Steinberger
4184e9833b docs: document chat target prefix helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
92405fb43a docs: document allowlist matcher invariants 2026-06-01 21:07:02 -04:00
Peter Steinberger
e6232d218f docs: document allowlist resolution helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
8044db357f docs: document plugin allow-from helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
219ff4f299 docs: document channel gating helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
2646058c9b docs: document channel ingress sender gates 2026-06-01 21:07:02 -04:00
Peter Steinberger
5ed4298fb3 docs: document channel ingress allowlist helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
66c359839a docs: document channel ingress identity helpers 2026-06-01 21:07:02 -04:00
Peter Steinberger
48dc4444ae docs: document channel ingress runtime invariants 2026-06-01 21:07:02 -04:00
Peter Steinberger
903612ab64 docs: document channel turn helper invariants 2026-06-01 21:07:02 -04:00
Peter Steinberger
a4d7a8e3d9 docs: document delivery result compatibility 2026-06-01 21:07:02 -04:00
Peter Steinberger
1edf373908 docs: document durable reply delivery 2026-06-01 21:07:02 -04:00
Peter Steinberger
e36f9bcb89 docs: document channel turn kernel invariants 2026-06-01 21:07:02 -04:00
Peter Steinberger
2aec8684a0 docs: document inbound reply dispatch delivery 2026-06-01 21:07:02 -04:00
Peter Steinberger
b32d6f48ca docs: document reply prefix context 2026-06-01 21:07:01 -04:00
Peter Steinberger
a69a86775b docs: document channel typing internals 2026-06-01 21:07:01 -04:00
Peter Steinberger
a116a0567e docs: document channel typing lifecycle 2026-06-01 21:07:01 -04:00
Peter Steinberger
0e16019ead docs: document channel reply pipeline contracts 2026-06-01 21:07:01 -04:00
Peter Steinberger
f56e36d828 docs: document channel inbound compatibility 2026-06-01 21:07:01 -04:00
Peter Steinberger
7b18277681 docs: document channel config helper contracts 2026-06-01 21:07:01 -04:00
Peter Steinberger
e2990c76df docs: document channel policy helper contracts 2026-06-01 21:07:01 -04:00
Peter Steinberger
7b8ff148af docs: document channel send result helpers 2026-06-01 21:07:01 -04:00
Peter Steinberger
bfc66fb505 docs: document channel route helper contracts 2026-06-01 21:07:01 -04:00
Peter Steinberger
ecba8fb765 docs: document status helper contracts 2026-06-01 21:07:01 -04:00
Peter Steinberger
4bb06ec498 docs: document webhook target helpers 2026-06-01 21:07:01 -04:00
Peter Steinberger
04f2a05a95 docs: document webhook memory guards 2026-06-01 21:07:01 -04:00
Peter Steinberger
783a709a94 docs: document webhook request guards 2026-06-01 21:07:01 -04:00
Peter Steinberger
c7240c46a7 docs: document plugin runtime store 2026-06-01 21:07:01 -04:00
Peter Steinberger
ec2f8ca948 docs: document agent harness task runtime 2026-06-01 21:07:01 -04:00
Peter Steinberger
5d489d45e8 docs: document agent harness task runtime scope 2026-06-01 21:07:01 -04:00
Peter Steinberger
bf3f207175 docs: document detached task runtime state 2026-06-01 21:07:01 -04:00
Peter Steinberger
3c65961276 docs: document detached task runtime dispatch 2026-06-01 21:07:01 -04:00
Peter Steinberger
f31c30fece docs: document detached task runtime contract 2026-06-01 21:07:01 -04:00
Peter Steinberger
124bb53ea9 docs: document task registry types 2026-06-01 21:07:01 -04:00
Peter Steinberger
fe7fcc9091 docs: document task registry summaries 2026-06-01 21:07:01 -04:00
Peter Steinberger
adf128510b docs: document task domain view mappers 2026-06-01 21:07:01 -04:00
Peter Steinberger
dcbf2dde4c docs: document task status helpers 2026-06-01 21:07:01 -04:00
Peter Steinberger
32a5c3848a docs: document required completion contract 2026-06-01 21:07:01 -04:00
Peter Steinberger
e1509529bf docs: document task executor policy helpers 2026-06-01 21:07:01 -04:00
Peter Steinberger
73b434f25b docs: document blocked taskflow retry helpers 2026-06-01 21:07:01 -04:00
Peter Steinberger
792976b76f docs: document taskflow executor helpers 2026-06-01 21:07:01 -04:00
Peter Steinberger
8aaf6d9a84 docs: document task owner access helpers 2026-06-01 21:07:01 -04:00
Peter Steinberger
30a4478c10 docs: document taskflow owner access helpers 2026-06-01 21:07:01 -04:00
Peter Steinberger
5d07ee772e docs: document managed taskflow runtime guards 2026-06-01 21:07:01 -04:00
Peter Steinberger
fa9ef924a2 docs: document managed taskflow runtime types 2026-06-01 21:07:01 -04:00
Peter Steinberger
f066d1c87e docs: document plugin runtime task DTOs 2026-06-01 21:07:01 -04:00
Peter Steinberger
05f2113302 docs: document plugin runtime task types 2026-06-01 21:07:01 -04:00
Peter Steinberger
3597ff0547 docs: document plugin runtime llm types 2026-06-01 21:07:01 -04:00
Peter Steinberger
dd90fd0255 docs: document plugin runtime core types 2026-06-01 21:07:01 -04:00
Peter Steinberger
cb04dd3028 docs: document plugin runtime types 2026-06-01 21:07:01 -04:00
Peter Steinberger
04505f86eb docs: document runtime context registry 2026-06-01 21:07:01 -04:00
Peter Steinberger
f0101337bb docs: document channel runtime surface types 2026-06-01 21:07:01 -04:00
Peter Steinberger
797777c813 docs: document channel runtime contexts 2026-06-01 21:07:01 -04:00
Peter Steinberger
c79b89173d docs: document approval handler bootstrap 2026-06-01 21:07:01 -04:00
Peter Steinberger
2a2228e496 docs: document exec approval channel runtime 2026-06-01 21:07:00 -04:00
Peter Steinberger
157fddee51 docs: document exec approval runtime types 2026-06-01 21:07:00 -04:00
Peter Steinberger
5ea6857491 docs: document approval native runtime helpers 2026-06-01 21:07:00 -04:00
Peter Steinberger
59eb39e39a docs: document approval route coordinator 2026-06-01 21:07:00 -04:00
Peter Steinberger
a2b0002d3f docs: document exec approval surface states 2026-06-01 21:07:00 -04:00
Peter Steinberger
0308347fa7 docs: document approval request filters 2026-06-01 21:07:00 -04:00
Peter Steinberger
cf6875e633 docs: document exec approval display sanitizers 2026-06-01 21:07:00 -04:00
Peter Steinberger
9cf1c116ff docs: document exec approval session targets 2026-06-01 21:07:00 -04:00
Peter Steinberger
3030a4973e docs: document approval account binding helpers 2026-06-01 21:07:00 -04:00
Peter Steinberger
8c59fbbe92 docs: document approval gateway resolver 2026-06-01 21:07:00 -04:00
Peter Steinberger
443791ef52 docs: document approval error detection 2026-06-01 21:07:00 -04:00
Peter Steinberger
9ee71023c2 docs: document approval turn-source routing 2026-06-01 21:07:00 -04:00
Peter Steinberger
731cfb6ff5 docs: document approval view model builders 2026-06-01 21:07:00 -04:00
Peter Steinberger
9e7f9915a0 docs: document approval view model unions 2026-06-01 21:07:00 -04:00
Peter Steinberger
ef20dc5f2f docs: document approval handler adapters 2026-06-01 21:07:00 -04:00
Peter Steinberger
f58a38b522 docs: document lazy approval runtime adapter 2026-06-01 21:07:00 -04:00
Peter Steinberger
05a13da12c docs: document approval handler runtime types 2026-06-01 21:07:00 -04:00
Peter Steinberger
e0cfcc3151 docs: document approval native runtime types 2026-06-01 21:07:00 -04:00
Peter Steinberger
ac61833b62 docs: document approval native target keys 2026-06-01 21:07:00 -04:00
Peter Steinberger
1683b809c1 docs: document approval native delivery planner 2026-06-01 21:07:00 -04:00
Peter Steinberger
78d012ece4 docs: document approval native route notices 2026-06-01 21:07:00 -04:00
Peter Steinberger
67d008d00e docs: document approval display path helper 2026-06-01 21:07:00 -04:00
Peter Steinberger
adeafcee18 docs: document exec approval surface helpers 2026-06-01 21:07:00 -04:00
Peter Steinberger
d9099828a4 docs: document safe-bin runtime policy 2026-06-01 21:07:00 -04:00
Peter Steinberger
0b66e2cd01 docs: document safe-bin argv validator 2026-06-01 21:07:00 -04:00
Peter Steinberger
beabbe9219 docs: document safe-bin semantic helpers 2026-06-01 21:07:00 -04:00
Peter Steinberger
62a27e1be5 docs: document safe-bin profile helpers 2026-06-01 21:07:00 -04:00
Peter Steinberger
cc31cddf54 docs: document safe-bin trust helpers 2026-06-01 21:07:00 -04:00
Peter Steinberger
d6fe20c350 docs: document exec allowlist pattern matching 2026-06-01 21:07:00 -04:00
Peter Steinberger
a483a2cbc5 docs: document shell wrapper APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
7fff122060 docs: document executable path helpers 2026-06-01 21:07:00 -04:00
Peter Steinberger
6b9185c6ec docs: document exec command resolution APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
473188bd1f docs: document exec command analysis APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
b734ccfa3c docs: document exec allowlist result APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
b8f1843909 docs: document system-run approval match result 2026-06-01 21:07:00 -04:00
Peter Steinberger
4048b087c3 docs: document exec approval request config APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
2a7e41b27b docs: document exec approval prompt policy 2026-06-01 21:07:00 -04:00
Peter Steinberger
2f5f5307ef docs: document exec approval allowlist APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
2439e2450a docs: document exec approval store APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
cec3fbae45 docs: document exec approval decision APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
7881649f7e docs: document dispatch wrapper resolution APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
355a411e2a docs: document exec approval reply APIs 2026-06-01 21:07:00 -04:00
Peter Steinberger
883f4cbf25 docs: document dotenv loader contracts 2026-06-01 21:06:59 -04:00
Peter Steinberger
eaf86695b3 docs: document update channel contracts 2026-06-01 21:06:59 -04:00
Peter Steinberger
0b3465e9a3 docs: document home directory helpers 2026-06-01 21:06:59 -04:00
Peter Steinberger
2478bd2db4 docs: document exec approval policy combinators 2026-06-01 21:06:59 -04:00
Peter Steinberger
c949857684 docs: document exec approval policy APIs 2026-06-01 21:06:59 -04:00
Peter Steinberger
37218ccd2b docs: document error kind contract 2026-06-01 21:06:59 -04:00
Peter Steinberger
298fcebd96 docs: document exec approval session target 2026-06-01 21:06:59 -04:00
Peter Steinberger
b62ab78f03 docs: document exec approval surface APIs 2026-06-01 21:06:59 -04:00
Peter Steinberger
e46cb79e93 docs: document event session routing APIs 2026-06-01 21:06:59 -04:00
Peter Steinberger
7f45dc815f docs: document approval request filters 2026-06-01 21:06:59 -04:00
Peter Steinberger
f5556b500e docs: document container environment helpers 2026-06-01 21:06:59 -04:00
Peter Steinberger
19821c958d docs: document clipboard helper 2026-06-01 21:06:59 -04:00
Peter Steinberger
c94964e3a0 docs: document clawhub spec parser 2026-06-01 21:06:59 -04:00
Peter Steinberger
e6ecffc7fb docs: document channel summary APIs 2026-06-01 21:06:59 -04:00
Peter Steinberger
fc5c22a238 docs: document channel runtime context APIs 2026-06-01 21:06:59 -04:00
Peter Steinberger
a4c1d64a33 docs: document bonjour discovery APIs 2026-06-01 21:06:59 -04:00
Peter Steinberger
9d96e542de docs: document diagnostic event APIs 2026-06-01 21:06:59 -04:00
Peter Steinberger
0ebc68745f docs: document channel activity helpers 2026-06-01 21:06:59 -04:00
Peter Steinberger
dd42bb9e4c docs: document agent event contracts 2026-06-01 21:06:59 -04:00
Peter Steinberger
59ab73f417 docs: document source reply mirror 2026-06-01 21:06:59 -04:00
Peter Steinberger
cb2ec869ac docs: document outbound session context 2026-06-01 21:06:59 -04:00
Peter Steinberger
1ca4396825 docs: document outbound delivery substrate 2026-06-01 21:06:59 -04:00
Peter Steinberger
98b2385585 docs: document session binding service 2026-06-01 21:06:59 -04:00
Peter Steinberger
0a1adb9290 docs: document delivery queue storage 2026-06-01 21:06:59 -04:00
Peter Steinberger
21662d3ee8 docs: document delivery recovery helpers 2026-06-01 21:06:59 -04:00
Peter Steinberger
a33ec61daa docs: document outbound message API 2026-06-01 21:06:59 -04:00
Peter Steinberger
1eb4a2a837 docs: document message action runner API 2026-06-01 21:06:59 -04:00
Peter Steinberger
1e7c7caba5 docs: document agent delivery helpers 2026-06-01 21:06:59 -04:00
Peter Steinberger
d97ce8e7c1 docs: document npm install env helpers 2026-06-01 21:06:59 -04:00
Peter Steinberger
8ef5d37f84 docs: document OpenClaw exec env marker 2026-06-01 21:06:59 -04:00
Peter Steinberger
2858ced19f docs: document shell env fallback 2026-06-01 21:06:59 -04:00
Peter Steinberger
19e4a47ba5 docs: document binary prerequisite helper 2026-06-01 21:06:59 -04:00
Peter Steinberger
4ab1f899c8 docs: document control UI asset helpers 2026-06-01 21:06:59 -04:00
Peter Steinberger
3159b1840b docs: document channel status issues 2026-06-01 21:06:59 -04:00
Peter Steinberger
d44507dd58 docs: document brew resolution 2026-06-01 21:06:59 -04:00
Peter Steinberger
1988f443dd docs: document CLI root option parsing 2026-06-01 21:06:59 -04:00
Peter Steinberger
a4e811a063 docs: document diagnostics timeline 2026-06-01 21:06:59 -04:00
Peter Steinberger
1e8b669bdc docs: document diagnostic LLM content policy 2026-06-01 21:06:59 -04:00
Peter Steinberger
76412b9e76 docs: document diagnostic trace context 2026-06-01 21:06:59 -04:00
Peter Steinberger
515acdb6b7 docs: document disk space helpers 2026-06-01 21:06:59 -04:00
Peter Steinberger
64598efd21 docs: document diagnostic flags 2026-06-01 21:06:58 -04:00
Peter Steinberger
e819d5718b docs: document embedded mode flag 2026-06-01 21:06:58 -04:00
Peter Steinberger
51cf923f7e docs: document package manager detection 2026-06-01 21:06:58 -04:00
Peter Steinberger
bf2628fd09 docs: document browser open helpers 2026-06-01 21:06:58 -04:00
Peter Steinberger
bc6ddea004 docs: document map size pruning 2026-06-01 21:06:58 -04:00
Peter Steinberger
cf6f086114 docs: document abort signal helper 2026-06-01 21:06:58 -04:00
Peter Steinberger
85f262ad3b docs: document channel activity 2026-06-01 21:06:58 -04:00
Peter Steinberger
07642fd3ac docs: document approval gateway runtime 2026-06-01 21:06:58 -04:00
Peter Steinberger
e9eb6a5a6e docs: document approval turn source auth 2026-06-01 21:06:58 -04:00
Peter Steinberger
058cf763b4 docs: document approval display errors 2026-06-01 21:06:58 -04:00
Peter Steinberger
e3439e2019 docs: document approval view model 2026-06-01 21:06:58 -04:00
Peter Steinberger
7e5a7eff15 docs: document approval handler runtime 2026-06-01 21:06:58 -04:00
Peter Steinberger
5d4b2081b5 docs: document native approval runtime 2026-06-01 21:06:58 -04:00
Peter Steinberger
b60e95ac50 docs: document native approval delivery 2026-06-01 21:06:58 -04:00
Peter Steinberger
9fbf3ab3f5 docs: document native approval route notices 2026-06-01 21:06:58 -04:00
Peter Steinberger
0a4ef8b44c docs: document approval request binding filters 2026-06-01 21:06:58 -04:00
Peter Steinberger
9d27524aae docs: document exec approval channel runtime 2026-06-01 21:06:58 -04:00
Peter Steinberger
37ee88c43a docs: document exec approval forwarder 2026-06-01 21:06:58 -04:00
Peter Steinberger
8c40322f6d docs: document exec approval reply routing 2026-06-01 21:06:58 -04:00
Peter Steinberger
9621d02c3b docs: document system-run approval binding 2026-06-01 21:06:58 -04:00
Peter Steinberger
db9524334d docs: document system-run approval context 2026-06-01 21:06:58 -04:00
Peter Steinberger
023d1c1346 docs: document system-run command contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
02257c6145 docs: document exec allowlist entry contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
63a085603d docs: document exec allowlist contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
6c1acbb51d docs: document safe-bin profile contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
3962e794a3 docs: document safe-bin trust contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
e93debe38a docs: document safe-bin runtime policy contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
2aa74b8be8 docs: document exec approval policy snapshots 2026-06-01 21:06:58 -04:00
Peter Steinberger
641329157f docs: document approval display contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
069e616b40 docs: document executable path contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
b72867c4ef docs: document exec command resolution contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
e7029418b2 docs: document shell inline command scanners 2026-06-01 21:06:58 -04:00
Peter Steinberger
0094f36bb9 docs: document shell wrapper trust contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
6a96f5701a docs: document dispatch wrapper trust contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
4d335bccae docs: document command carrier helper contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
018a5dccf1 docs: document command explainer span contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
3cb4554fe8 docs: document command policy analysis contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
d1d6900c6d docs: document command explanation summary contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
bd46b791e9 docs: document command risk carrier contracts 2026-06-01 21:06:58 -04:00
Peter Steinberger
3c781401ad docs: document inline eval detector contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
86581bd139 docs: document TCP port parser contract 2026-06-01 21:06:57 -04:00
Peter Steinberger
c5fda5eb9a docs: document port diagnostics contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
390434673e docs: document package tag input contract 2026-06-01 21:06:57 -04:00
Peter Steinberger
f27fdcbdb0 docs: document update channel contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
303141be85 docs: document inline option token contract 2026-06-01 21:06:57 -04:00
Peter Steinberger
580bc23dcc docs: document prototype key guard contract 2026-06-01 21:06:57 -04:00
Peter Steinberger
9e5f601c61 docs: document environment helper contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
d22b8d1cdb docs: document PATH bootstrap contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
01c5513c41 docs: document fetch header normalization contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
4dde1e9b54 docs: document secret file compatibility contract 2026-06-01 21:06:57 -04:00
Peter Steinberger
5efffc9184 docs: document JSON file helper contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
301aae5cd7 docs: document HTTP body guard contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
bd3f2929c0 docs: document fixed-window rate limiter contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
6a540d945c docs: document backoff helper contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
68a780bb3c docs: document retry engine contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
bd654bf5be docs: document retry policy contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
aa5996ff28 docs: document number coercion thresholds 2026-06-01 21:06:57 -04:00
Peter Steinberger
4404474a99 docs: document map and numeric option helpers 2026-06-01 21:06:57 -04:00
Peter Steinberger
edad8bd695 docs: document dedupe cache contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
f1fcb4763c docs: document diagnostic error metadata helpers 2026-06-01 21:06:57 -04:00
Peter Steinberger
c996011b0c docs: document shared error helpers 2026-06-01 21:06:57 -04:00
Peter Steinberger
b7659b414e docs: document reasoning tag partitioner contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
0c22351b0e docs: document trajectory path helpers 2026-06-01 21:06:57 -04:00
Peter Steinberger
a3c068ab46 docs: document trajectory runtime writer contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
34e60c7613 docs: document trajectory cleanup guards 2026-06-01 21:06:57 -04:00
Peter Steinberger
ae048ac2dc docs: document trajectory export contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
b97bc433ff docs: document trajectory metadata contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
82b69dceb8 docs: document support bundle writer contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
2ae9055e8d docs: document diagnostic support export contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
b1ec36802c docs: document support log sanitizer invariants 2026-06-01 21:06:57 -04:00
Peter Steinberger
98b8eb02d2 docs: document support redaction contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
9a6c1eb13f docs: document logging redaction API contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
10d44e6e2a docs: document bounded concurrency helper contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
7c3bf80220 docs: document fetch timeout abort contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
279f14f3fc docs: document gateway client public contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
9d50d2beb6 docs: document device auth payload contracts 2026-06-01 21:06:57 -04:00
Peter Steinberger
e9b481bbf6 docs: document gateway client readiness start rules 2026-06-01 21:06:57 -04:00
Peter Steinberger
2d2a4da093 docs: document event loop readiness probe fields 2026-06-01 21:06:57 -04:00
Peter Steinberger
aaebe74428 docs: document gateway timeout clamp rules 2026-06-01 21:06:56 -04:00
Peter Steinberger
ac68783d81 docs: document live plugin config fallback 2026-06-01 21:06:56 -04:00
Peter Steinberger
11169b5c6a docs: document node presence reasons 2026-06-01 21:06:56 -04:00
Peter Steinberger
a190b16ced docs: document avatar policy constants 2026-06-01 21:06:56 -04:00
Peter Steinberger
8be6591675 docs: document OpenAI Codex auth helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
e9982ad288 docs: document plugin command runner 2026-06-01 21:06:56 -04:00
Peter Steinberger
ef68275a6d docs: document tool send target fallback 2026-06-01 21:06:56 -04:00
Peter Steinberger
92aeda817d docs: document telegram account facade 2026-06-01 21:06:56 -04:00
Peter Steinberger
67a08ebadb docs: document runtime store helper 2026-06-01 21:06:56 -04:00
Peter Steinberger
e68c5861ac docs: document webhook request guard helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
0109afd7fc docs: document keyed async queue helper 2026-06-01 21:06:56 -04:00
Peter Steinberger
3bdd36b718 docs: document tool payload helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
0a88da285b docs: document plugin SDK runtime helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
3bab9e07d4 docs: document browser maintenance helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
77b22b4e22 docs: document safe record helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
30f28516d7 docs: document approval reaction helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
ecea9a3d8c docs: document provider catalog helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
02565857e8 docs: document provider onboard helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
32f1e0e3ac docs: document allowlist config helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
ddfe936ebe docs: document provider tool compat helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
2810c181ea docs: document persistent dedupe helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
911ebfa7fb docs: document account setup helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
8675ae253b docs: document auth and chunk helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
20c0ef5341 docs: document assistant text helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
ef1f870335 docs: document command status runtime 2026-06-01 21:06:56 -04:00
Peter Steinberger
74dfd528cc docs: document provider model helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
624f279b6c docs: document browser config helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
48e0fb965d docs: document QA scenario helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
22ccabe92e docs: document migration helper contracts 2026-06-01 21:06:56 -04:00
Peter Steinberger
bd3eea8a24 docs: document status helper payloads 2026-06-01 21:06:56 -04:00
Peter Steinberger
cb3ea96414 docs: document extension shared helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
cf2f6e8902 docs: document session policy payloads 2026-06-01 21:06:56 -04:00
Peter Steinberger
c11eb54ff3 docs: document webhook guard helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
b25cc2cb97 docs: document channel diagnostics helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
9693b72e87 docs: document thread binding label helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
b7f733f828 docs: document reply prefix typing guard helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
8f5c762f9b docs: document inbound debounce stream helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
170f7ac81b docs: document direct dm allow-from helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
bb70e68f82 docs: document channel match allowlist helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
fbeb08967c docs: document channel snapshot presence helpers 2026-06-01 21:06:56 -04:00
Peter Steinberger
69df840dd1 docs: document channel config helper contracts 2026-06-01 21:06:56 -04:00
Peter Steinberger
ea70737204 docs: document channel turn adapter contracts 2026-06-01 21:06:55 -04:00
Peter Steinberger
6950c25a89 docs: document channel turn delivery helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
45823c5f88 docs: document inbound reply bridge helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
4d4b9a76ce docs: document message receive capability helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
e08890f356 docs: document durable ingress queue helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
f63647a799 docs: document message outbound bridge helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
d49ce1011b docs: document durable message state fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
10f1f19a55 docs: document live message contracts 2026-06-01 21:06:55 -04:00
Peter Steinberger
eb45f7506e docs: document message receipt fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
72ddb522b4 docs: document channel turn helper fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
1a45a6d112 docs: document inbound event context helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
a227ce9cd5 docs: document conversation resolution helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
871ba88159 docs: document route projection helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
6588d77fa0 docs: document direct dm guard policy 2026-06-01 21:06:55 -04:00
Peter Steinberger
edbbbddf96 docs: document ack reaction helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
deddd60a50 docs: document channel target policy helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
8d5352fdf9 docs: document thread binding policy fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
b19e8edd45 docs: document command gating fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
9b3f19377d docs: document mention gating fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
035f50f0b3 docs: document entry status fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
8917f5fcd5 docs: document usage timeseries fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
7f8ae918e3 docs: document usage payload fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
a43dafe15d docs: document node list payload fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
0f883cb654 docs: document thread binding lifecycle fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
d2c55f660f docs: document runtime requirement fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
93efa868b9 docs: document requirement metadata fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
0c15c69e8f docs: document store writer queue fields 2026-06-01 21:06:55 -04:00
Peter Steinberger
40326fcd4f docs: document scoped id cache helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
d0c99db71b docs: document custom command config helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
333c28efe1 docs: document final tag parser helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
062c82ef82 docs: document device auth store helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
732f2e5375 docs: document node matching helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
db1246e1bd docs: document shared runtime policy helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
fb614861e0 docs: document shared utility helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
d887a39c28 docs: document assistant error format helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
f0e5fd6037 docs: document shared json schema helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
343c56a64c docs: document markdown table chunk helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
386044015b docs: document markdown ir helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
62edb0ccab docs: document markdown code span helpers 2026-06-01 21:06:55 -04:00
Peter Steinberger
8554efb754 docs: document markdown render helpers 2026-06-01 21:06:54 -04:00
17754 changed files with 134074 additions and 662703 deletions

View File

@@ -22,9 +22,7 @@ Use when:
- Read dependency docs/source/types when the finding depends on external behavior.
- Reject unrealistic edge cases, speculative risks, broad rewrites, and fixes that over-complicate the codebase.
- Prefer small fixes at the right ownership boundary; no refactor unless it clearly improves the bug class.
- When an accepted finding shows a bug class or repeated pattern, inspect the current PR scope for sibling instances before fixing.
- Fix the scoped bug class at once when practical; stop at touched surfaces, owner boundaries, and clear follow-up territory.
- Keep going until structured review returns no accepted/actionable findings only while the work remains inside the original task scope.
- Keep going until structured review returns no accepted/actionable findings.
- If a review-triggered fix changes code, rerun focused tests and rerun the structured review helper.
- For security-audit suppression changes, verify accepted findings remain auditable: suppressed findings stay in structured output, active output keeps an unsuppressible suppression notice, and aggregate findings cannot hide unrelated active risk.
- Never switch or override the requested review engine/model. If the review hits model capacity, retry the same command a few times with the same engine/model.
@@ -43,42 +41,6 @@ Use when:
- If Gitcrawl reports a portable manifest mismatch, source/runtime DB health error, or stale portable-store checkout, run `gitcrawl doctor --json` and inspect `source_db_health`, `runtime_db_health`, and `portable_store_status` before falling back to live GitHub.
- Do not push just to review. Push only when the user requested push/ship/PR update.
## Scope Governor
Autoreview is a closeout gate, not permission to rewrite the task.
Before the first review, freeze a scope baseline: original request or issue, target branch, intended behavior, owner boundary, changed files, and non-test LOC. For inherited or already-bloated branches, use the intended PR diff as the baseline rather than accepting all existing branch drift.
Before patching a finding, classify it:
- **In-scope blocker**: the finding is introduced by the current diff, affects the same owner boundary, and can be fixed without changing the task's contract.
- **Follow-up**: the finding is real but belongs to an adjacent bug class, sibling surface, cleanup, or broader hardening track.
- **Stop-and-escalate**: the finding requires a new protocol/config/storage/public API contract, a different owner boundary, a release-process change, or a design choice outside the original request.
Stop patching and report the scope break instead of continuing when:
- a narrow PR turns into an architecture change, protocol change, migration, or release-process change;
- the diff grows past 2x the original files or non-test LOC without explicit approval to expand scope;
- two review-triggered patch cycles have not converged; pause and reclassify every remaining finding before another edit;
- the best fix is "define the canonical contract first" rather than another local inference layer;
- fixing the accepted finding would make the PR no longer describe the same behavior, issue, or owner boundary.
After the two-cycle pause, continue only when every remaining accepted finding is still an in-scope blocker. Otherwise preserve the useful analysis, identify the smallest safe landed subset if one exists, and open or request a follow-up for the larger fix. Do not keep committing speculative fixes just to satisfy the reviewer.
Do not stack or push review-triggered fix commits while scope classification or focused proof is unresolved. Keep exploratory edits local until the cycle is proven in scope; if scope breaks, remove them from the landing lane instead of preserving them as branch history.
Critical exceptions must be explicit: active data loss, crash, broken install/upgrade, release blocker, or concrete security exposure. If the exception is not one of those, it is not critical enough to blow up scope.
## Release Branches And Release Process
On release, beta, stable, hotfix, signing, notarization, appcast, package-publish, or release-check work, use freeze discipline even when the branch name is not release-like:
- Fix only release blockers, failed release infrastructure, exact backports, install/upgrade breakage, data loss, crashes, or concrete security exposure.
- Treat non-blocking autoreview findings as follow-ups for `main`, not reasons to broaden the release branch.
- Do not introduce new product behavior, config surface, protocol shape, migration, plugin ownership, docs narrative, or process policy unless it directly unblocks the release.
- Keep proof tied to the release target: exact branch/ref, failing check or shipped-risk reason, smallest command/proof, and whether the fix must also forward-port to `main`.
- If review discovers a real but non-critical design problem during release closeout, stop with a follow-up issue/PR plan; do not use the release branch as the refactor lane.
## Pick Target
Dirty local work:

View File

@@ -440,36 +440,8 @@ def load_datasets(args: argparse.Namespace) -> str:
return "\n\n".join(chunks)
def review_scope_policy() -> str:
return textwrap.dedent(
"""
Review scope discipline:
- This helper is a closeout gate. Do not turn a narrow patch into a broad
redesign request.
- Report a finding only when this diff introduces or exposes a concrete
defect that must be fixed before this target can land.
- If the best fix requires a new protocol, config, storage, public API,
release process, migration, owner-boundary move, or canonical contract,
say that directly in the finding and keep the finding tied to the
smallest changed line that proves the current patch is not landable.
- Do not ask for sibling-surface hardening, cleanup, refactors, or
follow-up architecture work unless the current diff is incorrect
without that work.
- Prefer the smallest correct pre-merge fix. A broader ideal design is
not an actionable finding unless the current patch cannot safely land.
- If this is release-branch or release-process work, apply freeze
discipline. Report only release blockers, exact backport regressions,
install/upgrade breakage, crashes, data loss, concrete security
exposure, or release-infrastructure failures. Non-blocking design,
cleanup, and hardening concerns belong on main as follow-ups.
"""
).strip()
def build_prompt(repo: Path, target: str, target_ref: str | None, bundle: str, extra_prompt: str, datasets: str) -> str:
target_line = f"{target} {target_ref}" if target_ref else target
branch = current_branch(repo)
scope_policy = review_scope_policy()
return textwrap.dedent(
f"""
You are a senior code reviewer. Review the provided git change bundle only.
@@ -491,11 +463,8 @@ def build_prompt(repo: Path, target: str, target_ref: str | None, bundle: str, e
- If there are no actionable findings, return an empty findings array and mark the patch correct.
Review target: {target_line}
Current branch: {branch}
Repository: {repo}
{scope_policy}
{extra_prompt}
{datasets}

View File

@@ -3,7 +3,6 @@ from __future__ import annotations
import argparse
import os
import runpy
import shutil
import stat
import subprocess
@@ -146,23 +145,8 @@ def create_fixture_repo(repo: Path, fixture: str) -> None:
write_fixture_file(repo, MALICIOUS_CHANGED if fixture == "malicious" else BENIGN_CHANGED)
def validate_prompt_policy(repo: Path, autoreview: Path) -> None:
namespace = runpy.run_path(str(autoreview))
prompt = namespace["build_prompt"](repo, "local", None, "fixture diff", "", "")
required = (
"This helper is a closeout gate.",
"Do not turn a narrow patch into a broad",
"If this is release-branch or release-process work",
"Non-blocking design,",
)
missing = [needle for needle in required if needle not in prompt]
if missing:
raise RuntimeError(f"autoreview prompt missing scope policy: {missing}")
def run_reviews(repo: Path, script_dir: Path, fixture: str, engines: list[str]) -> None:
autoreview = script_dir / "autoreview"
validate_prompt_policy(repo, autoreview)
for engine in engines:
print(f"== {engine} ==", flush=True)
command = [

View File

@@ -1,34 +1,44 @@
---
name: channel-message-flows
description: "Use when running QA Lab channel message flow evidence."
description: "Use when previewing local channel message flow fixtures."
---
# Channel Message Flows
Use this from the OpenClaw repo root to run the QA Lab evidence for Telegram
draft/final delivery sequencing. This skill no longer launches a standalone
script; the behavior is owned by the QA scenario and its Vitest-backed e2e test.
Use this from the OpenClaw repo root to send canned channel preview flows while iterating on message UX. These are real sends/edits/deletes against the configured channel target.
## QA Scenario
## Telegram
Run the scenario through QA Lab:
Native Telegram `sendMessageDraft` tool progress, then a final answer:
```bash
pnpm openclaw qa suite --scenario channel-message-flows
node --import tsx scripts/dev/channel-message-flows.ts \
--channel telegram \
--target <telegram-chat-id> \
--flow working-final \
--duration-ms 20000
```
Run the focused e2e test directly in a Codex worktree:
Thinking preview, then a final answer:
```bash
node scripts/run-vitest.mjs extensions/telegram/src/channel-message-flows.qa.e2e.test.ts
node --import tsx scripts/dev/channel-message-flows.ts \
--channel telegram \
--target <telegram-chat-id> \
--flow thinking-final
```
## References
## Options
- `qa/scenarios/channels/channel-message-flows.yaml`
- `extensions/telegram/src/channel-message-flows.qa.e2e.test.ts`
- `extensions/telegram/src/test-support/channel-message-flows.ts`
- `--account <accountId>`: Telegram account id when not using the default.
- `--thread-id <id>`: Telegram forum topic/message thread id.
- `--delay-ms <ms>`: Override preview update cadence.
- `--duration-ms <ms>`: Simulated working duration for `working-final`.
- `--final-text <text>`: Override the durable final message.
The scenario covers `channels.streaming` as primary evidence and records
secondary coverage for thread preservation, delivery ordering, and reasoning
preview visibility.
## Notes
- `--target` is the numeric Telegram chat id.
- `working-final` exercises native Telegram `sendMessageDraft` with static `Working` status and sample tool progress.
- `thinking-final` exercises formatted `Thinking` reasoning preview clearing before the final answer.
- Only `--channel telegram` is implemented for now.

View File

@@ -1,175 +0,0 @@
---
name: claw-score
description: Audit or refresh OpenClaw maturity scorecard docs from root taxonomy, maturity scores, and QA evidence artifacts without using maintainer discrawl data or committed inventory reports.
---
# claw-score
Use this skill when working on the OpenClaw maturity scorecard in this repo.
This is the openclaw-local version of the maintainer `claw-score` workflow:
it keeps the taxonomy and scorecard concepts, but excludes discrawl and the old
committed `inventory/` report tree.
## Authority
This skill owns the operational workflow for:
- `taxonomy.yaml`
- `docs/maturity-scores.yaml`
- `docs/concepts/qa-e2e-automation.md`
- `qa/scenarios/index.yaml`
Keep person-specific, maintainer-private, Discord archive, and discrawl facts
out of this repo. If a score needs private evidence, use the redacted
`qa-evidence.json` artifact shape generated by OpenClaw QA workflows.
## Source Model
- `taxonomy.yaml` is the hand-edited source of truth for surfaces, levels,
QA profiles, categories, feature coverage IDs, docs refs, LTS overrides, and
completeness-instruction paths.
- Feature `coverageIds` are ANDed proof targets, not aliases. A feature may
list multiple IDs when each ID proves part of one capability.
- Keep categories and feature names unique, product-shaped, and broader than raw
coverage IDs. Do not promote generic IDs into standalone feature names.
- Avoid duplicate coverage-ID bundles under different feature names in one
category.
- `docs/maturity-scores.yaml` is the aggregate score source committed in this
repo. It is the only committed score data; do not add generated inventory
directories.
- There is no committed maturity-doc renderer or `pnpm maturity:*` script in
this repo. Do not invent generated scorecard files; update the source YAML
and current docs directly.
- `qa-evidence.json` artifacts provide per-run QA scorecard evidence. They can
enrich generated artifact docs, but they are not committed as inventory.
## Commands
Run from the openclaw repo root.
Validate YAML structure after source edits:
```bash
node <<'NODE'
const fs = require("node:fs");
const YAML = require("yaml");
for (const file of ["taxonomy.yaml", "docs/maturity-scores.yaml", "qa/scenarios/index.yaml"]) {
YAML.parse(fs.readFileSync(file, "utf8"));
}
NODE
```
Check docs when touching docs prose:
```bash
pnpm check:docs
```
Run focused QA/profile checks when changing coverage IDs or profile membership:
```bash
pnpm openclaw qa coverage --json
```
## Scoring Workflow
When asked to score or refresh a surface:
1. Read the surface in `taxonomy.yaml`.
2. Read the surface completeness rubric under
`.agents/skills/claw-score/references/completeness/`.
3. Gather public repo evidence from docs, source, tests, and QA scenario
metadata.
4. Prefer existing `qa-evidence.json` artifacts for executed proof. Do not use
discrawl or unredacted private archives.
5. Update `docs/maturity-scores.yaml` only when the score change is backed by
public or redacted artifact evidence.
6. Run the YAML validation command from this skill.
7. Run `pnpm check:docs` if docs prose changed, and focused QA coverage checks
if coverage IDs or profile membership changed.
For subjective score changes, make the smallest defensible edit and leave the
evidence path in the PR or task summary. Keep manual prose in current docs and
keep score data in `docs/maturity-scores.yaml`.
## Default Completeness Process
Completeness is scored against the intended operator-visible workflow for each
category, not against test breadth or implementation quality. The completeness
reference files under `references/completeness/` define the category scope and
any surface-specific variation from this default process.
By default, Completeness measures how fully OpenClaw exposes the intended
surface capability set to the user, operator, author, or maintainer persona for
that surface. Score whether each category delivers the full expected workflow,
including setup, normal use, status or inspection, recovery, and important
platform, provider, channel, security, or lifecycle variants where they apply.
Treat `Surface-Specific Scoring Questions` and `Surface-Specific Guidance` as
higher-priority instructions for that surface. The surface instructions may
flesh out, narrow, or intentionally conflict with the default ideas here; when
they do, follow the surface instructions and make the score rationale reflect
that surface-specific instruction. If a reference file does not include
surface-specific questions or guidance, apply this default process to the
surface's `Category Scope`.
For each category, ask:
- Can the intended user or operator complete the category workflow end to end?
- Are the taxonomy features present as supported capabilities rather than
isolated implementation fragments?
- Are the important lifecycle stages represented: setup, normal operation,
status/inspection, recovery, and upgrade or removal where relevant?
- Are the important environment, provider, platform, channel, or security
branches present for this surface?
- Do the known gaps leave major user-visible capability branches missing?
Default guidance:
- Favor higher Completeness when the category supports the full
operator-visible workflow described by taxonomy and category evidence.
- Lower Completeness when only the happy path exists, when important variants
are undocumented or unimplemented, or when recovery/status paths are missing.
- Do not lower Completeness because tests are thin; that is Coverage.
- Do not lower Completeness because implementation quality is fragile; that is
Quality.
Default Completeness bands:
- `Lovable` (95-100): complete across expected workflows, variants, and
recovery branches, with only minor polish gaps.
- `Stable` (80-95): the expected workflow set is broadly present, with only
bounded missing branches.
- `Beta` (70-80): the main workflow exists, but meaningful branches or recovery
paths are still absent.
- `Alpha` (50-70): only a partial capability set is present; users can complete
some core tasks but not the full expected workflow.
- `Experimental` (0-50): the category exposes only fragments of the intended
capability.
## Score Semantics
- Coverage: public or redacted proof that the feature is exercised by docs,
tests, QA scenarios, live lanes, or release evidence.
- Quality: reliability, maintainability, operator safety, and regression
confidence for the category.
- Completeness: how much of the intended operator-visible workflow exists for
the category. Use the default completeness process plus any surface-specific
variation before changing this score.
- LTS: derived from score thresholds and `human_lts_override`; do not hand-edit
generated Markdown to change LTS status.
Bands:
- `Lovable`: 95-100
- `Stable`: 80-95
- `Beta`: 70-80
- `Alpha`: 50-70
- `Experimental`: 0-50
## Artifacts
Do not add the maintainer repo's `docs/kevinslin/maturity-scorecard/inventory/`
tree to openclaw. Evidence-enriched scorecard outputs belong in short-lived
artifacts, not committed generated docs, unless this repo adds an explicit
renderer/check workflow first.

View File

@@ -1,16 +0,0 @@
# Agent Runtime Completeness
Use this rubric when assigning category Completeness scores for the
`agent-runtime-and-provider-execution` surface.
## Category Scope
- Agent Turn Execution: Turn startup and runtime choice, Session and run coordination, Abort and terminal outcomes
- External Runtimes and Subagents: External harness selection, CLI runtime aliases, Subagent turns, Runtime recovery
- Hosted Provider Execution: Hosted provider turns, Provider-specific model options, Hosted tool use, Reasoning and cache controls, Hosted streaming and replies
- Local and Self-hosted Providers: Local provider profiles, Tool-capability flags, Timeouts and context windows, Local smoke checks, Local failure handling
- Model and Runtime Selection: Model reference selection, Provider and runtime overrides, Thinking and context settings, Invalid route recovery
- Provider Auth: Login and API-key setup, Auth profile selection, Credential health checks, Auth failover, Provider fallback recovery, Rate-limit and capacity recovery, Missing-key and OAuth guidance, Restart and stale-route recovery, Structured provider diagnostics, Subagent credential propagation
- Streaming and Progress: Streaming replies, Progress visibility
- Tool Calls and Response Handling: Tool-call handling, Usage and response reporting, Failure recovery
- Tool Execution Controls: Tool availability rules, Sandboxed exec behavior, Approval flow, Elevated execution, Tool safety controls, Delegated tool access

View File

@@ -1,14 +0,0 @@
# Android app Completeness
Use this rubric when assigning category Completeness scores for the
`android-app` surface.
## Category Scope
- Media Capture: Camera and media capture
- Mobile Chat: Chat tab
- Connection Setup: Gateway discovery
- Distribution: Public Google Play install path, Manual install path, Release smoke and startup performance
- Settings: Settings sheet
- Voice: Voice tab
- Device Runtime: Background reconnect and presence, Device command availability

View File

@@ -1,12 +0,0 @@
# Anthropic provider path Completeness
Use this rubric when assigning category Completeness scores for the
`anthropic-provider-path` surface.
## Category Scope
- Provider Auth and Recovery: API-key onboarding, Claude CLI credential reuse, Setup-token auth, Auth profile health, Model status, Usage windows, Cooldown/profile reporting, Long-context recovery, Fallback guidance
- Model and Runtime Selection: Bundled Claude catalog, Canonical anthropic refs, Claude CLI compatibility, Model picker availability, Capability metadata, Runtime selection, Session continuity, MCP/tool bridge, Permission-mode mapping, Fallback prelude
- Request Transport and Turn Semantics: API-key/OAuth transport, Messages payloads, Streaming decode, Usage and stop reasons, Abort/error handling, Tool-use blocks, Tool-result replay, Partial JSON recovery, Native thinking, Signed/redacted thinking replay
- Prompt Cache and Context: Cache retention, System-prompt cache boundary, 1M context, Fast mode/service tier, Cache diagnostics
- Media Inputs: Image input, PDF document input, Media model fallback, Image tool results

View File

@@ -1,13 +0,0 @@
# Automation: cron, hooks, tasks, polling Completeness
Use this rubric when assigning category Completeness scores for the
`automation-cron-hooks-tasks-polling` surface.
## Category Scope
- Cron Jobs: Create/edit/remove jobs, Schedule types, Timezone and stagger, Cron RPCs, Agent cron tool, Manual cron runs, Isolated cron execution, Model/provider preflight, Run history, Timeout and denial diagnostics, Chat announce delivery, Webhook delivery, Failure destinations, Skipped-run alerts, Delivery previews
- Event Ingress: Telegram long polling, Telegram webhook mode, Zalo polling/webhook mode, Polling stall diagnostics, iMessage watch fallback, Gmail setup wizard, Watcher start/serve, Tailscale/public routing, Push token validation, Gmail event routing, POST /hooks/wake, POST /hooks/agent, Mapped hooks, Hook auth policy, Async dispatch
- Automation Hooks: HOOK.md authoring, Hook discovery, Hook CLI management, Hook packs, Lifecycle event dispatch, api.on registration, Tool-call policy hooks, Message hooks, Session/lifecycle hooks, Plugin approval requests, cron_changed
- Background Tasks and Flows: Task list/show/cancel, Task notifications, Task audit and maintenance, Chat task board, Task pressure status, Managed flows, Mirrored flows, openclaw tasks flow, Flow audit and maintenance, Plugin managedFlows
- Heartbeat: Heartbeat scheduling, Active hours, Wake and cooldown handling, Due-only heartbeat tasks, Commitment check-ins
- Polling Controls: openclaw message poll, Telegram polls, Teams polls, Poll flags, Channel capability gates, process poll, process log, Background process status, No-progress loop detection, Process input controls

View File

@@ -1,10 +0,0 @@
# Browser automation and exec/sandbox tools Completeness
Use this rubric when assigning category Completeness scores for the
`browser-automation-and-exec-sandbox-tools` surface.
## Category Scope
- Browser Automation: Browser Actions, Snapshots, Artifacts, Browser Plugin Service, Profiles, Browser Security, SSRF, Remote Control
- Tool Invocation and Execution: Exec Routing, Process Lifecycle, Direct Tool Invoke API, Node System.run, Host Exec Approvals, Elevated Mode
- Sandbox and Tool Policy: Sandbox Backends, Workspace Isolation, Sandboxed Browser, Codex Dynamic Tools, Tool Policy, Sandbox Tool Gates

View File

@@ -1,14 +0,0 @@
# Gateway Web App Completeness
Use this rubric when assigning category Completeness scores for the
`browser-control-ui-and-webchat` surface.
## Category Scope
- Browser Realtime Talk: Browser Talk start/stop, Provider session selection, Gateway relay audio, Tool-call consults, Steer and cancel
- Browser Access and Trust: Device pairing, Token/password auth, Tailscale Serve auth, Trusted proxy auth, Allowed origins/gatewayUrl
- Configuration: Config snapshots, Schema form editing, Raw JSON editing, Base-hash guarded writes, Apply and restart
- Browser UI: Gateway-hosted UI, Dashboard open/auth bootstrap, Base-path routing, Static asset recovery, Dev gatewayUrl target, PWA install metadata, Service worker updates, VAPID keys, Subscribe/unsubscribe, Test notifications
- WebChat Conversations: Send and abort, Session and agent picker, Model/thinking controls, Attachments, Markdown/tool/media rendering, chat.history projection, chat.send lifecycle, Abort/partial retention, Injected assistant notes, Reconnect continuity, Hosted embeds, External embed gating, Assistant media tickets, Authenticated avatars, CSP image policy
- Remote WebChat: macOS WebChat transport, SSH tunnel data plane, Direct ws/wss remote mode, Session continuity, Remote troubleshooting
- Operator Console: Health/status/models, Live log tail, Update run/status, Activity summaries, RPC timing telemetry, Channels/login, Session manager and history, Cron, Skills/nodes, Exec approvals/agents

View File

@@ -1,15 +0,0 @@
# Channel framework Completeness
Use this rubric when assigning category Completeness scores for the
`channel-framework` surface.
## Category Scope
- Channel Actions Commands and Approvals: Channel-native commands, Native command session target, Message actions, Message tool API discovery, Channel-native approval prompts
- Channel Setup: Supported channel catalog, Channel status taxonomy in channels list, Setup/onboarding flows, Install-on-demand, Setup wizard metadata
- Group Thread and Ambient Room Behavior: Group/channel session isolation, Mention-required, Native threads, Broadcast groups, Bot-loop protection
- Inbound Access and Identity Gates: DM pairing, Group/channel allowlists, Access group expansion, Mention gating, Sanitized inbound identity/route projections
- Media Attachments and Rich Channel Data: Inbound media normalization, Outbound direct text/media sends, Provider-specific channelData, Media roots
- Outbound Delivery and Reply Pipeline: Automatic final reply delivery, Durable outbound send orchestration, Reply pipeline transforms, Provider outbound adapter bridge
- Conversation Routing and Delivery: Inbound conversation routing, Session key construction, Agent binding precedence, Runtime conversation bindings, Thread/parent-child placement, Plugin registry resolution, Channel account startup, Whole-channel lifecycle controls, Config/secrets reload interactions, Auto-restart
- Status Health and Operator Controls: channels.status, Channel health policy, Operator CLI controls, Status read-model

View File

@@ -1,12 +0,0 @@
# ClawHub Completeness
Use this rubric when assigning category Completeness scores for the
`clawhub-and-external-plugin-distribution` surface.
## Category Scope
- Publishing: ClawHub package publishing owner, OpenClaw-owned package release validation for ClawHub, Version bump gates, npm trusted publishing provenance, External code plugin package contract required, Skill package metadata, Skill publishing flow
- Catalog Discovery: openclaw plugins search as the ClawHub, Search result metadata, Distinction between plugin search, Catalog lookup failure, Skill catalog search
- Compatibility and Trust: openclaw.compat.pluginApi, ClawHub package compatibility validation, npm compatibility fallback to the newest, Official external plugin catalog behavior, Compatibility docs, Operator trust model for installing, ClawHub archive, npm integrity drift, Built-in dangerous-code scanner, ClawHub publishing review/hidden-release behavior as upstream, Skill archive safety, Skill audit signals
- Plugin Lifecycle: Source prefixes, Bare package behavior during the launch, Explicit pinned versions, Managed install records that preserve source, Codex, Local, Marketplace list, Supported mapped features, Remote marketplace path safety, Update by plugin id, Reinstall vs update semantics, Downgrade, Uninstall config/index/policy/file cleanup, Gateway restart/reload requirements after, ClawHub skill installs, Skill upload install path, Skill dependency installers
- Plugin Health: Per-plugin managed npm project, npm-pack local release-candidate installs, Dependency ownership between plugin packages, Peer dependency relinking, Legacy dependency root cleanup, plugins list, Local plugin index, Troubleshooting stale config, Runtime verification after Gateway

View File

@@ -1,37 +0,0 @@
# CLI Surface Completeness
Use this rubric when assigning category Completeness scores for the
`cli-install-update-onboard-doctor` surface.
## Surface-Specific Scoring Questions
For each category, ask:
- Can a normal operator complete the job end to end from the CLI?
- Are the expected environments represented where they matter for the category,
such as local installs, remote gateway use, supervised services, or
Windows/WSL2?
- Are the main lifecycle stages present where relevant: setup, inspection,
change, repair, and upgrade?
- Are common recovery and troubleshooting branches present, or does the
workflow dead-end after the happy path?
- Are major documented operator expectations still unimplemented?
## Surface-Specific Guidance
Variation from the default completeness process:
- Completeness is the CLI operator journey for installation, onboarding, configuration, repair, and upgrade across expected environments and recovery branches.
- Score the CLI against the full operator journey, not only installation or the happy path.
- Repair, migration, remote, and platform-specific branches are expected where a category exposes them.
- For Windows and WSL2, score against the intended supported experience rather than parity with macOS/Linux internals.
## Category Scope
- CLI Setup: Installer scripts, Local prefix install, Package-manager installs, Supported Node runtime, Source checkout install, CLI entrypoint
- Onboarding and Auth Setup: Guided onboarding, Targeted reconfiguration, Auth choices, Gateway auth storage, Remote onboarding
- Plugin and Channel Setup: Channel picker, Plugin install sources, Channel account setup, Post-setup probes, Remote gateway caveat
- Gateway Service Management: Foreground gateway runs, Service install and control, Service auth wiring, Drift and reinstall recovery, Service health checks
- CLI Observability: Status snapshots, Health snapshots, Remote log tailing, Diagnostics export, Support-safe redaction
- Doctor: Interactive repair, Config migration, Auth and SecretRef checks, Plugin validation and repair, Lint and JSON findings, Extra gateway discovery, Supervisor drift repair, Port and startup diagnosis, Runtime path checks, Restart guidance
- Updates and Upgrades: Update channels, Install-kind switching, Managed gateway restart, Update status and RPC, Plugin convergence

View File

@@ -1,13 +0,0 @@
# Discord Completeness
Use this rubric when assigning category Completeness scores for the
`discord` surface.
## Category Scope
- Channel Setup and Operations: Application and bot setup, Token and application ID configuration, Setup wizard and account inspection, Status, doctor, and intent checks, Multi-account bot configuration, Account monitor startup, Gateway WebSocket lifecycle, Reconnect and heartbeat handling, Rate limits and gateway metadata, Status, probe, and health-monitor recovery
- Access and Identity: DM policy modes, Allowlist inheritance, Pairing-code approval, Sender authorization, Access-group authorization, Group DM authorization
- Conversation Routing and Delivery: Guild and channel admission, Mention gating, Session key isolation, Configured and runtime routing, Inbound context visibility, Forum and media-channel thread posts, Thread actions, Target parsing, Thread context resolution, Thread-bound session routing, ACP agent routing, Routing lifecycle, Discord forum/media channel posts created as, CLI and message-tool thread actions, Discord target parsing for `channel:<id>`, Thread context resolution, Thread-bound session routing for `/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`, `sessions_spawn({ thread, ACP current-conversation bindings and ACP thread, Binding lifecycle behavior, Direct and thread sends, Text chunking and reply mode, Draft and progress edits, Mention and embed rendering, REST retry and final delivery, File uploads, Component file and media-gallery blocks, Video caption follow-up, Voice-message upload, Inbound attachment context
- Media and Rich Content: Direct and thread sends, Text chunking and reply mode, Draft and progress edits, Mention and embed rendering, REST retry and final delivery, File uploads, Component file and media-gallery blocks, Video caption follow-up, Voice-message upload, Inbound attachment context, Direct and thread sends, Text chunking and reply mode, Draft and progress edits, Mention and embed rendering, REST retry and final delivery, File uploads, Component file and media-gallery blocks, Video caption follow-up, Voice-message upload, Inbound attachment context, Outbound file uploads from URLs and, Component v2 file and media-gallery blocks, Video caption handling and follow-up media-only delivery, Discord voice-message sends with OGG/Opus conversion, Inbound media/attachment-aware debounce behavior, Realtime voice-channel conversations, General text-only delivery
- Native Controls and Approvals: Native slash command registration, Native slash command execution, Model Picker Commands, Components v2 messages, Callback TTL, Native Discord exec/plugin approvals, Sensitive owner-only command routing for prompts, Discord message actions, Action gates under channels.discord.actions.\*
- Realtime Voice and Calls: Voice Channel Lifecycle, Auto-join and follow-users, Realtime voice modes, Wake, barge-in, and echo handling, Voice codec and DAVE recovery

View File

@@ -1,11 +0,0 @@
# Docker / Podman hosting Completeness
Use this rubric when assigning category Completeness scores for the
`docker-podman-hosting` surface.
## Category Scope
- Container Setup: Local Image Setup Script, Docker Compose gateway, First-run onboarding, Docker-only first-run notes, Podman setup scripts and Quadlet template, Rootless Podman image setup
- Container Operations: Host CLI routing into running Docker/Podman, Container Targeting, Container update/rebuild/restart guidance for Docker, Docker Compose, Gateway token generation, Ownership, Docker Compose, Container health endpoints, Provider/VPS Docker hosting docs, Docker VM persistence/update guidance, Operator-facing update
- Image Release and Validation: Root Dockerfile build stages, Docker release workflow, Docker E2E package artifact generation, Docker E2E plan/scheduler scripts, Release-path install
- Agent Sandbox and Tooling: Docker gateway setup, Docker-backed agent sandbox support, Container image dependency baking

View File

@@ -1,11 +0,0 @@
# Feishu, QQ Bot, WeChat, Yuanbao, Zalo, Zalo Personal, regional channels Completeness
Use this rubric when assigning category Completeness scores for the
`feishu-qq-bot-wechat-yuanbao-zalo-zalo-personal-regional-channels` surface.
## Category Scope
- Channel Setup and Operations: Docs channel index, Official external channel catalog entries, Core channel-plugin catalog, Channel setup wizard, Missing-plugin, Cross-channel ingress/access/refactor concerns, Feishu/Lark bot channel setup, WebSocket default mode, DM pairing, Message delivery, Feishu document, Multi-account credential handling, QQ Open Platform AppID/AppSecret setup, C2C private chat, Group activation, Rich media messages, Slash commands, Multi-account gateway connections, Tencent Yuanbao external channel, AppKey/AppSecret setup, DMs, Outbound queue strategy, Core-side official external catalog, Zalo Bot Creator / Marketplace bot, Long-polling default mode, Bot token, Group policy schema, Text, Status probes, WeChat/Weixin personal messaging, Plugin install, Direct-message pairing, Core-side catalog metadata, External sidecar/helper process behavior, zalouser channel plugin, QR login, DM pairing, Message send, Doctor/status checks for runtime availability, Explicit unofficial-account risk, QQ Open Platform AppID/AppSecret setup and, C2C private chat, Group activation, Inbound and outbound rich media including, Slash commands, Multi-account gateway connections, Tencent Yuanbao external channel `openclaw-plugin-yuanbao, AppKey/AppSecret setup, DMs, Outbound queue strategy, Core-side official external catalog, Zalo Bot Creator / Marketplace bot, Long-polling default mode and optional HTTPS, Bot token, Group policy schema and fail-closed group, Text, Status probes and troubleshooting for token/config/webhook problems, zalouser` channel plugin for Zalo Personal, QR login, DM pairing, Message send, Doctor/status checks for runtime availability and, Explicit unofficial-account risk and operator safeguards
- Access and Identity: Feishu/Lark bot channel setup, WebSocket default mode, DM pairing, Message delivery, Feishu document, Multi-account credential handling, QQ Open Platform AppID/AppSecret setup, C2C private chat, Group activation, Rich media messages, Slash commands, Multi-account gateway connections, Tencent Yuanbao external channel, AppKey/AppSecret setup, DMs, Outbound queue strategy, Core-side official external catalog, Zalo Bot Creator / Marketplace bot, Long-polling default mode, Bot token, Group policy schema, Text, Status probes, WeChat/Weixin personal messaging, Plugin install, Direct-message pairing, Core-side catalog metadata, External sidecar/helper process behavior, zalouser channel plugin, QR login, DM pairing, Message send, Doctor/status checks for runtime availability, Explicit unofficial-account risk, QQ Open Platform AppID/AppSecret setup and, C2C private chat, Group activation, Inbound and outbound rich media including, Slash commands, Multi-account gateway connections, Tencent Yuanbao external channel `openclaw-plugin-yuanbao, AppKey/AppSecret setup, DMs, Outbound queue strategy, Core-side official external catalog, zalouser` channel plugin for Zalo Personal, QR login, DM pairing, Message send, Doctor/status checks for runtime availability and, Explicit unofficial-account risk and operator safeguards
- Conversation Routing and Delivery: Feishu/Lark bot channel setup, WebSocket default mode, DM pairing, Message delivery, Feishu document, Multi-account credential handling, QQ Open Platform AppID/AppSecret setup, C2C private chat, Group activation, Rich media messages, Slash commands, Multi-account gateway connections, Tencent Yuanbao external channel, AppKey/AppSecret setup, DMs, Outbound queue strategy, Core-side official external catalog, Zalo Bot Creator / Marketplace bot, Long-polling default mode, Bot token, Group policy schema, Text, Status probes, WeChat/Weixin personal messaging, Plugin install, Direct-message pairing, Core-side catalog metadata, External sidecar/helper process behavior, zalouser channel plugin, QR login, DM pairing, Message send, Doctor/status checks for runtime availability, Explicit unofficial-account risk, QQ Open Platform AppID/AppSecret setup and, C2C private chat, Group activation, Inbound and outbound rich media including, Slash commands, Multi-account gateway connections, Tencent Yuanbao external channel `openclaw-plugin-yuanbao, AppKey/AppSecret setup, DMs, Outbound queue strategy, Core-side official external catalog, Zalo Bot Creator / Marketplace bot, Long-polling default mode and optional HTTPS, Bot token, Group policy schema and fail-closed group, Text, Status probes and troubleshooting for token/config/webhook problems, zalouser` channel plugin for Zalo Personal, QR login, DM pairing, Message send, Doctor/status checks for runtime availability and, Explicit unofficial-account risk and operator safeguards
- Media and Rich Content: Feishu/Lark bot channel setup, WebSocket default mode, DM pairing, Message delivery, Feishu document, Multi-account credential handling, QQ Open Platform AppID/AppSecret setup, C2C private chat, Group activation, Rich media messages, Slash commands, Multi-account gateway connections, Tencent Yuanbao external channel, AppKey/AppSecret setup, DMs, Outbound queue strategy, Core-side official external catalog, Zalo Bot Creator / Marketplace bot, Long-polling default mode, Bot token, Group policy schema, Text, Status probes, QQ Open Platform AppID/AppSecret setup and, C2C private chat, Group activation, Inbound and outbound rich media including, Slash commands, Multi-account gateway connections, Zalo Bot Creator / Marketplace bot, Long-polling default mode and optional HTTPS, Bot token, Group policy schema and fail-closed group, Text, Status probes and troubleshooting for token/config/webhook problems

View File

@@ -1,43 +0,0 @@
# Gateway Runtime Completeness
Use this rubric when assigning category Completeness scores for the
`gateway-runtime` surface.
## Surface-Specific Scoring Questions
For each category, ask:
- Does the category cover the main happy path an operator or client needs?
- Are the major deployment modes present where they matter for this category:
local, remote, node-mediated, supervised, or browser-facing?
- Are the main lifecycle stages present where relevant: setup, normal use,
status/inspection, and recovery?
- Are important security or policy branches present where the category implies
them?
- Are obvious operator-visible holes or "not yet supported" branches still
missing?
## Surface-Specific Guidance
Variation from the default completeness process:
- Completeness includes operator and connected-client workflows, major deployment modes, and recovery paths, not just gateway protocol capability.
- Score the Gateway against the full operator and client journey, not just protocol primitives or one transport path.
- Local, remote, node-mediated, supervised, and browser-facing modes matter when the category implies them.
- Approval/policy variants and recovery or diagnostic paths count as completeness branches, not polish.
## Category Scope
- Approvals and Remote Execution: Exec approvals, Plugin approvals, Node exec approvals, Approved node execution, Approval mutation safety, Delivery fallback behavior
- HTTP APIs: OpenAI-compatible APIs, Tool invocation API, Admin API access, Hook ingress
- Hosted Web Surface: Control UI, WebChat hosting, Plugin web routes, Canvas and A2UI routes
- Gateway RPC APIs and Events: Health APIs, Identity and presence APIs, Model APIs, Usage and memory APIs, Session APIs, Chat APIs, Channel APIs, Web login and wake APIs, Config and secrets APIs, Update and setup APIs, Agent and artifact APIs, Task and automation APIs, Tool and skill APIs, Request and event envelopes, Idempotent side effects, Method discovery, Event discovery, Accepted-then-final results, Event ordering, State refresh after gaps
- Device Auth and Pairing: Shared-secret login, Trusted proxy auth, Private ingress mode, Device challenge signing, Device tokens, Setup-code bootstrap, Auth mismatch recovery, Device auth migration, Client pairing, Node pairing
- Network Access and Discovery: Loopback and LAN access, Tailnet access, SSH tunnels, Endpoint discovery, Saved endpoints, TLS pinning
- Nodes and Remote Capabilities: Node presence, Node capabilities, Node inventory, Node actions, Node events, Pending work delivery, Remote device capabilities, Remote host commands
- Health, Diagnostics, and Repair: Health snapshots, Channel readiness, Stability diagnostics, Payload diagnostics, Diagnostics exports, Doctor checks, Log tailing
- Protocol Compatibility: Published protocol schema, Runtime request validation, JSON Schema export, Swift client models, Version negotiation, Client transport defaults, Backward-compatible evolution
- Roles and Permissions: Role negotiation, Operator permissions, Approval-gated actions, Untrusted node declarations, Event scoping
- Gateway Lifecycle: Foreground startup, Service installation, Restart and stop, Service status, Bind and port settings, Config reload, Multi-gateway isolation
- Security Controls: Non-loopback auth, Trusted proxy exceptions, Gateway and node trust boundaries, Trusted CIDR auto-approval, Fail-closed protocol handling, Remote execution safeguards
- WebSocket Connection: WebSocket transport, Connect challenge, Connect request, Protocol version negotiation, hello-ok snapshot, Startup retry, Session limits, Plugin surface URLs

View File

@@ -1,12 +0,0 @@
# Google Chat Completeness
Use this rubric when assigning category Completeness scores for the
`google-chat` surface.
## Category Scope
- Channel Setup and Operations: Google Cloud project setup, Chat app configuration, Service account setup, Webhook audience and path, Workspace visibility and app status, Guided channel setup, Account resolution, Service account SecretRefs, Env file and inline credentials, Channel status and probes, Directory and mutable-id diagnostics, NPM and ClawHub install, Plugin docs and catalog routing, Channel aliases and labels, Operator status UI, Install/update metadata, Webhook path handling, Standard Chat token verification, Workspace add-on token verification, Audience and appPrincipal validation, Shared-path target selection, Auth rejection diagnostics, Account resolution, Service account SecretRefs, Env file and inline credentials, Channel status and probes, Directory and mutable-id diagnostics, NPM and ClawHub install, Plugin docs and catalog routing, Channel aliases and labels, Operator status UI, Install/update metadata, Webhook path handling, Standard Chat token verification, Workspace add-on token verification, Audience and appPrincipal binding, Shared-path target selection, Auth rejection diagnostics
- Access and Identity: DM pairing approval, Sender allowlists, Google Chat identity matching, Direct session routing, Pairing diagnostics, Space allowlists, Mention gating, Sender access groups, Group session isolation, Bot-loop protection, Space diagnostics
- Conversation Routing and Delivery: DM pairing approval, Sender allowlists, Google Chat identity matching, Direct session routing, Pairing diagnostics, Space allowlists, Mention gating, Sender access groups, Group session isolation, Bot-loop protection, Space diagnostics, Inbound attachments, Outbound media replies, Message upload action, Media source and size controls, Media receipts and thread placement, Text send action, Upload-file action, Reaction actions, Action capability gates, Approval sender matching, Thread-aware replies, Streaming and chunked replies, Typing placeholder lifecycle, Message-tool current-source replies, NO_REPLY cleanup, Markdown/text rendering, Thread-aware replies, Streaming and chunked replies, Typing placeholder lifecycle, Message-tool current-source replies, NO_REPLY cleanup, Markdown/text rendering
- Media and Rich Content: Inbound attachments, Outbound media replies, Message upload action, Media source and size controls, Media receipts and thread placement, Text send action, Upload-file action, Reaction actions, Action capability gates, Approval sender matching, Thread-aware replies, Streaming and chunked replies, Typing placeholder lifecycle, Message-tool current-source replies, NO_REPLY cleanup, Markdown/text rendering
- Native Controls and Approvals: Inbound attachments, Outbound media replies, Message upload action, Media source and size controls, Media receipts and thread placement, Text send action, Upload-file action, Reaction actions, Action capability gates, Approval sender matching, Thread-aware replies, Streaming and chunked replies, Typing placeholder lifecycle, Message-tool current-source replies, NO_REPLY cleanup, Markdown/text rendering

View File

@@ -1,12 +0,0 @@
# Google provider path Completeness
Use this rubric when assigning category Completeness scores for the
`google-provider-path` surface.
## Category Scope
- Provider Setup and Credentials: API key onboarding, Auth choice metadata, Gemini CLI OAuth setup, Vertex ADC setup, Daemon and fallback credentials, CLI runtime selection, OAuth login and refresh, Canonical Google model refs, CLI usage normalization, OAuth diagnostics
- Model Routing and Endpoints: Catalog rows and aliases, Dynamic model resolution, Provider routing, Google-native config normalization, Model picker availability, Vertex provider selection, ADC/service-account auth, Project/location endpoints, Custom base URL policy, Compatibility boundaries
- Direct Gemini Runtime: Direct Gemini chat, Multimodal inputs, Tool-call streaming, Usage and stop reasons, Thought-signature replay, Thinking-level mapping, Thought-signature replay, Tool turn ordering, Incomplete-turn recovery, Planning-only turn recovery
- Media, Search, and Realtime: Bundled plugin distribution, Provider auto-enable metadata, Image and media adapters, Speech and realtime adapters, Search and generation tools, Realtime voice sessions, Constrained browser tokens, Audio and transcript events, Live tool calls, Session reconnects
- Prompt Caching: Cache retention config, Managed cachedContents, Manual cachedContent handles, Cache usage accounting, Cache diagnostics and live proof

View File

@@ -1,12 +0,0 @@
# Image/video/music generation tools Completeness
Use this rubric when assigning category Completeness scores for the
`image-video-music-generation-tools` surface.
## Category Scope
- Media Routing and Discovery: default media model config, per-call model refs and fallbacks, auth-backed tool discovery, action=list provider inspection
- Task Lifecycle and Delivery: background task creation, task status/list/show/cancel, duplicate guards, progress keepalive, completion/failure wake, no-session inline fallback, local media persistence, MIME/filename inference, Hosted URL fallback, message-tool handoff, idempotent missing-media fallback, channel attachment proof
- Image Generation: text-to-image, reference-image editing, output hints, action=status, provider attempt metadata, OpenAI/Codex OAuth, API-key OpenAI, OpenRouter/xAI/fal/LiteLLM/DeepInfra/Google/MiniMax/ComfyUI auth, provider error diagnostics
- Video Generation: text-to-video, image-to-video, video-to-video, reference role validation, audio refs, typed providerOptions, queue-backed jobs, polling/timeout handling, Hosted URL download, provider skip explanations, returned asset metadata
- Music Generation: prompt and lyrics input, instrumental mode, duration/format controls, image-reference edit lanes, generated audio outputs, provider fallback

View File

@@ -1,12 +0,0 @@
# iMessage / BlueBubbles Completeness
Use this rubric when assigning category Completeness scores for the
`imessage-bluebubbles` surface.
## Category Scope
- Channel Setup and Operations: Translate legacy config, Cut over safely, Handle migration caveats, Run local imsg, Run through SSH wrapper, Grant macOS permissions, Probe runtime health, Account setup prompts, Account status checks, Doctor repair checks, Account Config, Translate legacy config, Cut over safely, Handle migration caveats, Run local imsg, Run through SSH wrapper, Grant macOS permissions, Probe runtime health
- Access and Identity: Authorize direct senders, Route direct conversations, Bind ACP sessions, Group Policy, Mentions, System Prompts, Group Policy, Mentions, System Prompts
- Conversation Routing and Delivery: Watch live messages, Coalesce split-send DMs, Replay missed messages, Seed conversation history, Authorize direct senders, Route direct conversations, Bind ACP sessions, Group Policy, Mentions, System Prompts
- Media and Rich Content: Media, Attachments, Remote Fetch, Chunking, Native Actions, Private API, Message Tool
- Native Controls and Approvals: Native Approvals, Reactions, Operator Control, Media, Attachments, Remote Fetch, Chunking, Native Actions, Private API, Message Tool, Native Actions, Private API, Message Tool

View File

@@ -1,15 +0,0 @@
# iOS app Completeness
Use this rubric when assigning category Completeness scores for the
`ios-app` surface.
## Category Scope
- Media and Sharing: Camera list/snap/clip
- Canvas and Screen: Canvas present/hide/navigate/eval/snapshot
- Chat and Sessions: Chat sessions and operator controls
- Gateway Setup and Diagnostics: Bonjour/local, Manual host/port, Gateway connect configuration persistence, TLS fingerprint trust prompt, Pairing approval, Pairing/auth diagnostics for users, Settings tab
- Distribution: Internal preview status
- Device Commands: Location modes, Device command handling
- Notifications and Background: APNs registration and relay delivery
- Voice: Voice wake

View File

@@ -1,29 +0,0 @@
# Kubernetes Hosting Completeness
Use this rubric when assigning category Completeness scores for the
`kubernetes-hosting` surface.
## Surface-Specific Scoring Questions
For each category, ask:
- Can an operator deploy and manage OpenClaw on Kubernetes end to end?
- Are the taxonomy features present as supported manifests, commands, and docs rather than examples only?
- Are setup, normal operation, status or inspection, redeploy, teardown, and secret rotation represented where relevant?
- Are local Kind validation, namespace/image customization, provider secrets, and secure exposure branches covered?
- Do known gaps leave major cluster-hosting capability branches missing?
## Surface-Specific Guidance
Variation from the default completeness process:
- Completeness is the Kubernetes operator workflow for deployment, configuration, secrets, access, exposure, lifecycle, security posture, status, and recovery.
- A complete Kubernetes category lets an operator deploy, expose, secure, update, troubleshoot, and remove the Gateway without relying on Docker-only assumptions.
- Happy-path port-forwarding, missing secret/config rotation, or omitted exposed-service security posture are material completeness gaps.
## Category Scope
- Deployment Setup: Kustomize packaging, cluster prerequisites, quick deploy, manifest apply, and Kind validation.
- Configuration and Secrets: agent instructions, Gateway config, provider secrets, secret rotation, and image/namespace customization.
- Access and Exposure: port-forward access, service endpoint, ingress exposure, auth/TLS, and localhost posture.
- Cluster Lifecycle: resource layout, state persistence, redeploy, teardown, and security context.

View File

@@ -1,12 +0,0 @@
# Linux companion app Completeness
Use this rubric when assigning category Completeness scores for the
`linux-companion-app` surface.
## Category Scope
- App Distribution: Native app package, Distro package targets, Official release metadata
- Gateway Connectivity: Local Gateway attach and status, Gateway pairing and auth, Remote mode, Local and remote resource boundaries
- Chat and Sessions: Native Linux chat window, Transcript, Gateway chat transport
- Desktop Capabilities: Linux desktop permissions, Secret storage, Sandbox/package posture, Linux native node identity, Host command execution, Desktop tools, Linux native Talk, Microphone capture, Native media permissions
- Status and Diagnostics: Native Linux app readiness, Gateway health/status display, Log/transcript opening, Doctor/repair affordances, Linux tray/status item, Runtime status row, Desktop-environment integration

View File

@@ -1,12 +0,0 @@
# Linux Gateway host Completeness
Use this rubric when assigning category Completeness scores for the
`linux-gateway-host` surface.
## Category Scope
- Host Setup and Updates: Linux CLI install, Node runtime prerequisites, Package-manager policy, Update path
- Gateway Runtime and Service Control: Foreground Gateway Runtime, Process Control, Systemd User Service Lifecycle setup, Systemd User Service Lifecycle operation, Systemd User Service Lifecycle status, Systemd User Service Lifecycle recovery
- Remote Access and Security: Remote Network Exposure, TLS, Tailscale, Gateway exposure safeguards, Gateway authentication modes, Secret Handling
- Diagnostics and Repair: Gateway diagnostic reports, Gateway log tailing, Doctor checks, Operator repair guidance
- Deployment Targets: VPS, Container, Cloud Deployment Guidance

View File

@@ -1,12 +0,0 @@
# Local model providers: Ollama, vLLM, SGLang, LM Studio Completeness
Use this rubric when assigning category Completeness scores for the
`local-model-providers-ollama-vllm-sglang-lm-studio` surface.
## Category Scope
- Provider Setup, Lifecycle, and Diagnostics: Provider Selection, Onboarding, localService configuration, Process startup and readiness, Request leases and idle shutdown, Health checks and restart, Provider recipes, Local provider status, Backend reachability probes, Model availability errors, Memory readiness diagnostics, Provider troubleshooting docs
- Native Provider Plugins: Ollama setup and model pulling, Model discovery, Streaming and vision, Ollama embeddings, Web-search support, LM Studio setup, Model discovery and auth, Model preload and JIT loading, Streaming compatibility, LM Studio embeddings
- OpenAI-Compatible Runtime Compatibility: Bundled provider setup, Model Discovery Endpoint, Non-interactive configuration, vLLM thinking controls, OpenAI-compatible chat and tool semantics, SGLang compatibility guidance, Request Stream Compatibility, Tool Calling
- Local Memory and Embeddings: Embedding provider selection, Memory search readiness, memoryFlush model override, Fallback lexical search, Provider mismatch guidance
- Network Safety and Prompt Controls: Safety Network, Prompt Pressure Controls

View File

@@ -1,10 +0,0 @@
# Long-tail hosted providers Completeness
Use this rubric when assigning category Completeness scores for the
`long-tail-hosted-providers` surface.
## Category Scope
- Hosted LLM Providers: Bedrock setup, Gateway/proxy routing, Copilot/OpenCode hosted access, Proxy capability diagnostics, Hosted text completion, Tool-call and streaming compatibility, Model catalog resolution, Provider-specific request shaping, Regional provider setup, Region and plan routing, Regional live smoke, Account prerequisite diagnostics
- Hosted Media Providers: Image generation providers, Video generation providers, Music generation providers, Media mode coverage, Text-to-speech providers, Speech-to-text providers, Realtime transcription providers, Audio format diagnostics
- Provider Operations: Provider directory, Provider install catalog, Model catalog metadata, Catalog parity checks, Provider setup descriptors, Auth profiles and aliases, Credential health probes, Key rotation and recovery, Direct provider smoke, Gateway live smoke, Models status probes, Fallback trace and repair

View File

@@ -1,14 +0,0 @@
# macOS companion app Completeness
Use this rubric when assigning category Completeness scores for the
`macos-companion-app` surface.
## Category Scope
- Canvas: Canvas panel open/hide/navigate/eval/snapshot, Local custom URL scheme, A2UI host auto-navigation, Canvas enable/disable setting
- Local Setup: Local mode Gateway attach/start/stop, LaunchAgent install/update/restart/uninstall, Existing-listener detection, Native first-run onboarding flow, CLI discovery, Local workspace selection, Onboarding WebChat session separation
- Status and Settings: Menu-bar status, Activity state ingestion, Settings navigation, Health polling, Channels settings
- Native Capabilities: Mac node session connection, system.run, Exec approval policy, Permission requests, TCC persistence
- Remote Connections: Remote connection mode selection, SSH tunnel, Gateway discovery
- Voice and Talk: Voice Wake runtime, Push-to-talk, Talk provider playback plan
- WebChat: Native SwiftUI WebChat window, Gateway chat transport, Local and remote data-plane reuse

View File

@@ -1,14 +0,0 @@
# macOS Gateway host Completeness
Use this rubric when assigning category Completeness scores for the
`macos-gateway-host` surface.
## Category Scope
- CLI Setup: Hosted installer, Node 24 recommendation, App-triggered CLI install, Shell PATH and version-manager drift
- Local Gateway Integration: App local/remote connection mode, App-managed Gateway LaunchAgent install/restart/uninstall, CLI install detection, Attach-to-existing local Gateway compatibility, Gateway endpoint, gateway.mode=local configuration, Loopback bind, Local app endpoint resolution, Bonjour discovery
- Remote Gateway Mode: macOS app "Remote over SSH", SSH tunnel setup, Tailscale MagicDNS, Remote endpoint token/password/TLS fingerprint, Local node host startup
- Gateway Service Lifecycle: Per-user Gateway LaunchAgent install, launchctl bootstrap, LaunchAgent labels, Gateway token/env handling, App-managed LaunchAgent handoff, openclaw update package/git handoff, Managed service refresh, Stale updater launchd job detection, openclaw uninstall, Stranded service recovery
- Diagnostics and Observability: LaunchAgent log paths, openclaw gateway status --deep, Gateway silently stops responding, Stale updater jobs
- Permissions and Native Capabilities: macOS TCC permission prompts/status, Native node capability exposure, system.run policy, Permission-driven support
- Profiles and Isolation: Profile-specific LaunchAgent labels, Profile-specific state/config/workspace roots, Derived ports, Rescue bot setup, Extra Gateway process detection

View File

@@ -1,13 +0,0 @@
# Matrix Completeness
Use this rubric when assigning category Completeness scores for the
`matrix` surface.
## Category Scope
- Channel Setup and Operations: Matrix plugin identity, Setup wizard, Account discovery, Matrix doctor warnings, Matrix probe/status, Shared Matrix client resolution, Monitor startup, Startup maintenance, Matrix doctor warnings, Matrix probe/status, Monitor startup, Startup maintenance
- Access and Identity: DM policy, Direct-room classification, Inbound route selection across sender-bound DMs, Mention gates, Matrix thread reply routing, Persisted Matrix thread routing managers, ACP/subagent spawn hooks
- Conversation Routing and Delivery: DM policy, Direct-room classification, Inbound route selection across sender-bound DMs, Mention gates, Matrix thread reply routing, Persisted Matrix thread routing managers, ACP/subagent spawn hooks, Channel action discovery, Message send/read/edit/delete, Profile media loading, Outbound Matrix text, Message presentation metadata, Inbound media failure handling, Message send/read/edit/delete, Profile media loading, Outbound Matrix text, Message presentation metadata, Inbound media failure handling
- Media and Rich Content: Channel action discovery, Message send/read/edit/delete, Profile media loading, Outbound Matrix text, Message presentation metadata, Inbound media failure handling
- Native Controls and Approvals: Channel action discovery, Message send/read/edit/delete, Profile media loading, Outbound Matrix text, Message presentation metadata, Inbound media failure handling, Matrix native exec, Origin target resolution from Matrix turn, Approver DM target resolution, Matrix approval metadata, Origin target resolution from Matrix turn, Approver DM target resolution, Matrix approval metadata
- Encryption and Verification: Encryption setup, Encrypted media upload/download, Legacy state

View File

@@ -1,11 +0,0 @@
# Mattermost, LINE, IRC, Nextcloud Talk, Nostr, Twitch, Tlon, Synology Chat Completeness
Use this rubric when assigning category Completeness scores for the
`mattermost-line-irc-nextcloud-talk-nostr-twitch-tlon-synology-chat` surface.
## Category Scope
- Channel Setup and Operations: Mattermost bot account setup, WebSocket inbound monitoring, Outbound delivery, LINE Messaging API webhook setup, Signed inbound webhook events, Rich LINE payloads, Nextcloud Talk bot installation, Webhook ingress, Outbound markdown/text, Synology Chat incoming/outgoing webhook setup, Webhook token verification, Outbound text, IRC server/nick/TLS/NickServ setup, Raw IRC receive/send, Probe/status, Twitch bot account setup, Twitch IRC monitor/client lifecycle, Message tool send action, Nostr key setup, NIP-04 encrypted DM receive/send, Profile import/publish, Tlon/Urbit ship URL/code setup, Urbit API auth/session, Rich text conversion, Nextcloud Talk bot installation, Webhook ingress, Outbound markdown/text, Synology Chat incoming/outgoing webhook setup, Webhook token verification, Outbound text and URL media delivery, Twitch bot account setup, Twitch IRC monitor/client lifecycle, Message tool send action, Tlon/Urbit ship URL/code setup, Urbit API auth/session, Rich text conversion
- Access and Identity: Mattermost bot account setup, WebSocket inbound monitoring, Outbound delivery, LINE Messaging API webhook setup, Signed inbound webhook events, Rich LINE payloads, Nextcloud Talk bot installation, Webhook ingress, Outbound markdown/text, Synology Chat incoming/outgoing webhook setup, Webhook token verification, Outbound text, IRC server/nick/TLS/NickServ setup, Raw IRC receive/send, Probe/status, Twitch bot account setup, Twitch IRC monitor/client lifecycle, Message tool send action, Nostr key setup, NIP-04 encrypted DM receive/send, Profile import/publish, Tlon/Urbit ship URL/code setup, Urbit API auth/session, Rich text conversion, Synology Chat incoming/outgoing webhook setup, Webhook token verification, Outbound text and URL media delivery, Tlon/Urbit ship URL/code setup, Urbit API auth/session, Rich text conversion
- Conversation Routing and Delivery: Mattermost bot account setup, WebSocket inbound monitoring, Outbound delivery, LINE Messaging API webhook setup, Signed inbound webhook events, Rich LINE payloads, Nextcloud Talk bot installation, Webhook ingress, Outbound markdown/text, Synology Chat incoming/outgoing webhook setup, Webhook token verification, Outbound text, IRC server/nick/TLS/NickServ setup, Raw IRC receive/send, Probe/status, Twitch bot account setup, Twitch IRC monitor/client lifecycle, Message tool send action, Nostr key setup, NIP-04 encrypted DM receive/send, Profile import/publish, Tlon/Urbit ship URL/code setup, Urbit API auth/session, Rich text conversion, Nextcloud Talk bot installation, Webhook ingress, Outbound markdown/text, Synology Chat incoming/outgoing webhook setup, Webhook token verification, Outbound text and URL media delivery, Twitch bot account setup, Twitch IRC monitor/client lifecycle, Message tool send action, Tlon/Urbit ship URL/code setup, Urbit API auth/session, Rich text conversion
- Media and Rich Content: LINE Messaging API webhook setup, Signed inbound webhook events, Rich LINE payloads, Nextcloud Talk bot installation, Webhook ingress, Outbound markdown/text, Synology Chat incoming/outgoing webhook setup, Webhook token verification, Outbound text, Nostr key setup, NIP-04 encrypted DM receive/send, Profile import/publish, Tlon/Urbit ship URL/code setup, Urbit API auth/session, Rich text conversion, Tlon/Urbit ship URL/code setup, Urbit API auth/session, Rich text conversion

View File

@@ -1,13 +0,0 @@
# Media understanding and media generation Completeness
Use this rubric when assigning category Completeness scores for the
`media-understanding-and-media-generation` surface.
## Category Scope
- Media Intake and Access: Local and remote media references, MIME and type detection, Size caps and bounded reads, Safe remote fetch, Local root policy, Inbound media store, PDF/document extraction dispatch, QR and media helper classification
- Channel Media Handling: Inbound attachment staging, Sandbox media rewrites, Reply media templating, Message-tool attachment delivery, Duplicate delivery suppression
- Media Configuration: Media capability configuration
- Text-to-Speech Delivery: TTS, Outbound Voice Audio Delivery
- Media Understanding: Audio attachment selection, Batch STT provider and CLI fallback, Voice-note mention preflight, Transcript insertion and echo, Audio proxy and limit handling, Inbound image summarization, Active vision model bypass, Text-only model media offload, Vision provider fallback, Image and PDF input routing, Video Understanding, Direct Video Analysis
- Media Generation: Image generation tool invocation, Provider and model selection, Reference image editing, Generated image task lifecycle, Generated image persistence and delivery, Music generation tool invocation, Provider and model selection, Lyrics, instrumental, duration, and format controls, Reference inputs where supported, Music task lifecycle and duplicate status, Generated audio persistence and delivery, Video generation tool invocation, Mode and provider capability selection, Reference image, video, and audio inputs, Provider option validation, Video task lifecycle and status, Generated video persistence and delivery

View File

@@ -1,12 +0,0 @@
# Microsoft Teams Completeness
Use this rubric when assigning category Completeness scores for the
`microsoft-teams` surface.
## Category Scope
- Channel Setup and Operations: Teams CLI app creation, Bot registration and manifest upload, Credential configuration, Teams app install verification, Setup status, Probe and scope reporting, Teams app doctor, Webhook and health diagnostics, Operator repair paths, Text formatting and chunking, Adaptive and presentation cards, Progress streaming, Delivery receipts and errors, Queued and proactive replies, Webhook Runtime, SDK Lifecycle, Proactive Cloud Boundary, Setup status, Probe and scope reporting, Teams app doctor, Webhook and health diagnostics, Operator repair paths, Webhook Runtime, SDK Lifecycle, Proactive Cloud Boundary
- Access and Identity: DM pairing, Stable sender identity, Allowlists and access groups, Invoke and command authorization, Teams-originated config writes, Bot Framework SSO invokes, Delegated token storage, Graph directory lookup, Member profile lookup, Bot Framework SSO invokes, Delegated token storage, Graph directory lookup, Member profile lookup
- Conversation Routing and Delivery: Team and channel allowlists, Deterministic channel replies, Mention-gated group access, Session routing, Reply and thread context, Text formatting and chunking, Adaptive and presentation cards, Progress streaming, Delivery receipts and errors, Queued and proactive replies, Webhook Runtime, SDK Lifecycle, Proactive Cloud Boundary, Text formatting and chunking, Adaptive and presentation cards, Progress streaming, Delivery receipts and errors, Queued and proactive replies, Webhook Runtime, SDK Lifecycle, Proactive Cloud Boundary
- Media and Rich Content: Inbound attachments, Graph-hosted media, File consent, SharePoint and OneDrive sharing, Media fetch safety
- Native Controls and Approvals: Message action discovery, Polls and reactions, Read, edit, delete, and pin, Native approval cards, Feedback and group actions

View File

@@ -1,31 +0,0 @@
# Multi-Agent Orchestration Completeness
Use this rubric when assigning category Completeness scores for the
`multi-agent-orchestration` surface.
## Surface-Specific Scoring Questions
For each category, ask:
- Can an operator configure and run the category workflow end to end?
- Are the taxonomy features present as supported user paths rather than partial config fragments?
- Are setup, normal operation, status or inspection, recovery, and removal paths represented where relevant?
- Are channel, account, workspace, auth, task, and delegate variants covered where the category expects them?
- Do known gaps leave major coordination or isolation branches missing?
## Surface-Specific Guidance
Variation from the default completeness process:
- Completeness is the operator-facing system for setup, isolation, conversation routing, account routing, specialist lanes, delegate identity, status, recovery, and safe defaults.
- A complete category lets multiple agents be created, isolated, routed, delegated, and inspected without implicit cross-agent leakage.
- Undocumented config, nondeterministic routing, or unclear ownership of state, credentials, and outbound delivery are material completeness gaps.
## Category Scope
- Agent Setup: add agents, agent list/delete, identity files, non-interactive setup, and single-agent default.
- Agent Isolation: workspace separation, state separation, auth separation, session separation, and tool profiles.
- Conversation Routing: agent selection, route precedence, default fallback, peer overrides, and cross-channel examples.
- Account Routing: multi-account setup, account selection, default accounts, account credentials, and delivery targets.
- Specialist Lanes: lane contracts, background handoff, concurrency controls, priority controls, and coordinator handoff.
- Delegate Identities: named delegates, authority model, delegate tiers, identity delegation, and organizational assistants.

View File

@@ -1,11 +0,0 @@
# Native Windows CLI and Gateway Completeness
Use this rubric when assigning category Completeness scores for the
`native-windows-cli-and-gateway` surface.
## Category Scope
- Setup: PowerShell installer, Node and package-manager bootstrap, npm global install, Packaged CLI launcher, Windows command shims, openclaw onboard, Local Gateway config, Daemon install flags, Native-vs-WSL setup boundary
- Gateway Management: openclaw gateway, Foreground runtime health/readiness, Windows-specific restart/signal, Unmanaged foreground mode, openclaw gateway install, Gateway launcher files, Scheduled Task runtime status, Startup-folder fallback, openclaw status, Windows service inspection, Post-install diagnostics
- Networking: Native Windows host binding, netsh interface portproxy, Gateway status and probe output, Loopback, LAN, and WSL boundary
- Updates: openclaw update on native Windows package, Managed Gateway stop/restart, Detached update handoff, Windows package locks

View File

@@ -1,12 +0,0 @@
# Native Windows companion app Completeness
Use this rubric when assigning category Completeness scores for the
`native-windows-companion-app` surface.
## Category Scope
- Installation and Updates: Official app download, MSI/MSIX/App Installer/winget-style packaging, Windows architecture handling for x64, App release channel
- Gateway Connection: App-managed local Gateway attach/start, Remote Gateway connection modes, Device/node pairing
- Chat Sessions: Native Windows chat window, Gateway chat transport
- Status and Repair: App health states, App-specific repair, Windows system tray app, Status indicators, App-specific notification permission
- Desktop Tools and Permissions: Windows node identity, Host command execution, Desktop command policy, App approval prompts, Screen and media capture, Canvas host behavior, Windows shell integrations, App secrets, Windows ACL, Command approval

View File

@@ -1,12 +0,0 @@
# Nix install path Completeness
Use this rubric when assigning category Completeness scores for the
`nix-install-path` surface.
## Category Scope
- Install Handoff: Nix install overview, nix-openclaw source-of-truth, Install discoverability, Verification handoff
- Plugin Lifecycle: Lifecycle command refusal, Declarative plugin selection, Nix-store plugin loading, Hardlink safety
- Activation and App UX: Environment activation, macOS defaults activation, Runtime Nix-mode detection, Stable Nix defaults, Managed-by-Nix banner, Read-only config controls, Onboarding skip
- Config and State: Immutable config guard, Config writer refusal, Agent-first Nix edits, Explicit config path, Writable state directory, Immutable-store config support, State integrity checks
- Service Runtime and Guards: Nix profile PATH discovery, Profile precedence, Service PATH fallback, Trusted binary boundaries, Setup write refusal, Doctor repair refusal, Update handoff, Service lifecycle handoff

View File

@@ -1,12 +0,0 @@
# OpenAI / Codex provider path Completeness
Use this rubric when assigning category Completeness scores for the
`openai-codex-provider-path` surface.
## Category Scope
- Model and Auth: Canonical OpenAI Model Routing, Catalog, Codex OAuth Profiles, Subscription Usage, Doctor Diagnostics, Operator Repair
- Responses and Tool Compatibility: Codex Responses Transport, Payload Compatibility, Tool Context, Capability Compatibility
- Native Codex Harness: Native Codex App-server Harness, Thread Lifecycle
- Image and Multimodal Input: Image Generation Editing, Multimodal Input
- Voice and Realtime Audio: Realtime Voice Transcription, Speech

View File

@@ -1,31 +0,0 @@
# OpenClaw App SDK Completeness
Use this rubric when assigning category Completeness scores for the
`openclaw-app-sdk` surface.
## Surface-Specific Scoring Questions
For each category, ask:
- Can an external app developer complete the category workflow using public SDK APIs?
- Are the taxonomy features represented by stable client contracts rather than protocol-only fragments?
- Are setup, authentication, streaming, result handling, error behavior, and compatibility expectations documented?
- Are browser, Node, React, testing, and custom transport variants covered where the category expects them?
- Do known gaps leave major external-app capability branches missing?
## Surface-Specific Guidance
Variation from the default completeness process:
- Completeness is the external app-developer workflow from connection through agent runs, sessions, events, approvals, resources, compatibility, and operational error handling.
- A complete SDK category exposes typed, documented, reusable client APIs instead of requiring low-level Gateway protocol work.
- Manual Gateway frame construction or reliance on internal package shapes is a material completeness gap.
## Category Scope
- Client API: SDK entrypoints, namespace layout, package split, and app/plugin boundary.
- Gateway Access: Gateway connect, URL and token config, auto gateway, custom transport, and scopes/redaction.
- Agent Conversations: agent handles, agent runs, run results, session creation, session send, and session controls.
- Events and Approvals: event stream, event envelope, replay cursors, approval callbacks, and questions.
- Resource Helpers: models, ToolSpace, artifacts, tasks, and environments.
- Compatibility: generated client, ergonomic wrappers, unsupported calls, schema alignment, and public package contract.

View File

@@ -1,11 +0,0 @@
# OpenRouter provider path Completeness
Use this rubric when assigning category Completeness scores for the
`openrouter-provider-path` surface.
## Category Scope
- Provider Setup and Auth: First-run setup, Default model selection, Provider plugin registration, Model-ref examples, OPENROUTER_API_KEY, Auth profiles and auth order, Status/probe and removal, Provider-entry SecretRef/API-key resolution, Gateway env inheritance, Static catalog rows, Dynamic /models discovery, openrouter/auto and nested refs, Free-model scan/probe, Model list/picker cache
- Chat Runtime and Normalization: Chat completions route, Provider routing params, Per-model route overrides, Reasoning payload policy, Anthropic/Gemini/DeepSeek variants, Streamed content parsing, reasoning_details visible output, Tool-call delta preservation, Family-specific replay policy, Response-model and usage normalization, Attribution headers, Response-cache headers/TTL/clear, Anthropic cache-control markers, Cache usage mapping, Custom proxy exclusions
- Provider Recovery and Diagnostics: Timeout/retry classification, Auth/billing/key-limit classification, Context overflow, Model fallback notices, Guarded fetch/pricing warnings
- Media Generation and Speech: image_generate OpenRouter route, video_generate async jobs/polling/download, music_generate audio route, Text-to-speech, Speech-to-text transcription, Inbound media understanding, Generated artifact delivery

View File

@@ -1,40 +0,0 @@
# Plugin Surface Completeness
Use this rubric when assigning category Completeness scores for the
`plugin-sdk-and-bundled-plugin-architecture` surface.
## Surface-Specific Scoring Questions
For each category, ask:
- Can the intended plugin task be completed end to end by an author or
operator?
- Are the important plugin variants present for this category, such as channel,
provider, tool, bundled, local, npm, or ClawHub flows?
- Are the main lifecycle stages present where relevant: create, configure,
validate, run, update, and remove or roll back?
- Are compatibility, approval, or safety branches present when the category
implies them?
- Are important author/operator-visible gaps still forcing workarounds or
unsupported paths?
## Surface-Specific Guidance
Variation from the default completeness process:
- Completeness is the plugin author or operator lifecycle for authoring, packaging, installing, running, approving, publishing, and testing plugins, not just SDK or runtime primitives.
- Score the plugin surface against the full plugin journey, not only one import path, packaging mode, or runtime path.
- Bundled-only support or support for only selected plugin families is incomplete when the category implies broader plugin capability.
- Publishing and testing categories should include expected lifecycle support, not just raw commands or fixtures.
## Category Scope
- Authoring and Packaging plugins: Root SDK entrypoint, Focused SDK imports, Entrypoint discovery, Migration shims, Plugin manifest, Package metadata, Runtime compatibility, Validation feedback
- Bundled plugins: Bundled plugin listing, Bundled source overlays, Packaged bundled plugins, Generated plugin inventory, Bundled channel IDs
- Canvas plugin: Hosted Canvas and A2UI surfaces, Agent canvas tool, Node Canvas commands, Control UI embeds, Canvas documents, A2UI transport and snapshots
- Installing and running plugins: Plugin setup, Runtime activation, Enable and disable, Safe load failures, Dependency repair, Install update and uninstall
- Channel plugins: Inbound event handling, Outbound delivery, Ingress authorization, Destination resolution, Native approval prompts
- Provider and tool plugins: Provider plugins, Tool plugins, Model catalogs, Provider auth, Web search and fetch, Mixed plugins
- Plugin approvals: Approval requests, Native approval delivery, Same-chat fallbacks, Exec and plugin separation, Approval replay protection, Security helpers
- Publishing plugins: Install sources, ClawHub publishing, npm publishing, Compatibility signaling, Update and rollback expectations, Third-party publication rules
- Testing plugins: Test fixtures, Local test environment, Plugin runtime harness, Unit and integration scaffolds, Docker lifecycle suites, Smoke tests

View File

@@ -1,11 +0,0 @@
# Raspberry Pi / small Linux devices Completeness
Use this rubric when assigning category Completeness scores for the
`raspberry-pi-small-linux-devices` surface.
## Category Scope
- Setup and Compatibility: Hardware and 64-bit OS requirements, Node runtime setup, OpenClaw install and onboarding, First-run verification, Supported Pi model selection, 64-bit ARM boundary, Unsupported device guidance, Slow-device caveats, npm/pnpm/Bun install modes, Installer architecture detection, Optional ARM binary checks, Fallback/build guidance
- Remote Access and Auth: Headless API-key auth, Gateway shared-secret auth, Device pairing approvals, SecretRef handling, Token drift recovery, SSH tunnel dashboard access, Tailscale Serve/Funnel, Loopback/non-loopback exposure controls, Authenticated Control UI access
- Gateway Runtime: Always-on Gateway process, Cloud model configuration, Channel startup, Gateway health/status, User service install, linger/boot persistence, Service drop-ins, Restart tuning, Status/log inspection, Backup/restore
- Performance and Diagnostics: Swap and low-RAM tuning, USB SSD guidance, Compile cache/no-respawn settings, OOM/performance troubleshooting, Diagnostics bundles

View File

@@ -1,13 +0,0 @@
# Security, auth, pairing, and secrets Completeness
Use this rubric when assigning category Completeness scores for the
`security-auth-pairing-and-secrets` surface.
## Category Scope
- Approval Policy and Tool Safeguards: Approval Policy, Dangerous Tool Safeguards
- Gateway Auth and Remote Access: Shared Gateway token/password auth, Gateway auth mode, Trusted-proxy identity, Tailscale Serve/Funnel, Bind and origin restrictions, WebSocket handshake auth, Operator-facing docs, Browser Control UI, Remote Client Trust
- Channel Access Control: Channel Identity, Allowlists, Sender Pairing
- Device and Node Pairing: Setup codes, Device identity creation, Device-token issuance, Device pairing approvals for operator, Operator scopes that gate pairing, Local Control UI, Auth migration, Operator-facing docs, Node Pairing, Capability Trust, Remote Exec Approvals
- Plugin Trust: Plugin Installation Trust, Security Boundaries
- Credential and Secret Hygiene: Provider Auth Profiles, API Key Health, Secrets Storage, Redaction, Configuration Hygiene

View File

@@ -1,17 +0,0 @@
# Session, memory, and context engine Completeness
Use this rubric when assigning category Completeness scores for the
`session-memory-and-context-engine` surface.
## Category Scope
- CLI Session and Transcript Management: CLI Session, Transcript Management
- Compaction, Pruning, and Token Pressure: Compaction, Pruning, Token Pressure
- Context Engine and Runtime Assembly: Context Engine, Runtime Assembly
- Cross-client History and Session Parity: Cross-client History, Session Parity
- Diagnostics, Maintenance, and Recovery: Diagnostics, Maintenance, Recovery
- Instruction Profile and Context Visibility: Instruction Profile, Context Visibility
- Memory Backend Storage and Embedding Search: Memory Backend Storage, Embedding Search
- Memory Files, Tools, and Active Memory: Memory Files, Tools, Active Memory
- Session Routing and Conversation Binding: Session Routing, Conversation Binding
- Transcript Persistence and Durability: Transcript Persistence, Durability

View File

@@ -1,12 +0,0 @@
# Signal Completeness
Use this rubric when assigning category Completeness scores for the
`signal` surface.
## Category Scope
- Setup and Account Health: QR link setup, SMS registration, Installer and binary setup, Container account provisioning, Status probes, Setup diagnostics, Account safety guardrails
- Conversation Access and Routing: DM pairing, DM allowlists, Sender identity normalization, Group allowlists, Mention gates, Pending group history
- Message Delivery and Actions: Text delivery targets, Media delivery and limits, Typing and read receipts, Styled/chunked output, Reaction action discovery, Add/remove reactions, Group reaction targeting
- Native Approvals: Native approval routing, Reaction approval responses, Approver targeting
- Transport: Native daemon transport, Container transport, API mode selection, Receive reconnect/readiness

View File

@@ -1,12 +0,0 @@
# Slack Completeness
Use this rubric when assigning category Completeness scores for the
`slack` surface.
## Category Scope
- Channel Setup and Operations: App Install, Slack app credentials, Manifest, Scopes, Channel status diagnostics, Slack account status, Operator Repair, Socket, HTTP transport, Runtime Lifecycle, Socket, HTTP transport, Runtime Lifecycle, Channel status diagnostics, Slack account status, Operator Repair
- Access and Identity: Channel allowlists, Thread routing, Session Isolation, DM Pairing, Sender Authorization
- Conversation Routing and Delivery: Channel allowlists, Thread routing, Session Isolation, DM Pairing, Sender Authorization, Outbound Delivery, Streaming, Reactions, Media, Attachments, Files, Vision, Outbound Delivery, Streaming, Reactions, Media, Attachments, Files, Vision
- Media and Rich Content: Outbound Delivery, Streaming, Reactions, Media, Attachments, Files, Vision
- Native Controls and Approvals: Slash Commands, Native Command Routing, Interactive Replies, App Home, Assistant Events, Native Approvals, Actions, Security-sensitive Ops, Interactive Replies, App Home, Assistant Events, Native Approvals, Actions, Security-sensitive Ops

View File

@@ -1,12 +0,0 @@
# Telegram Completeness
Use this rubric when assigning category Completeness scores for the
`telegram` surface.
## Category Scope
- Channel Setup and Operations: BotFather token creation, TELEGRAM_BOT_TOKEN, Setup wizard credential capture, Startup getMe, Doctor/status surfacing, Named account configuration, CLI/message-tool targets, Directory adapters, Channel status, Account-scoped outbound, Long polling runner startup, Webhook listener startup, Reconnect, Restart, Named account configuration, Directory adapters and configured peers/groups for, Channel status, Account-scoped outbound, Long polling runner startup, Reconnect, Restart
- Access and Identity: dmPolicy modes, Pairing-code approval, Numeric Telegram user ID normalization with telegram, allowFrom, Unauthorized DM, Group allowlists, Supergroup negative chat IDs, Forum topic session keys, ACP topic routing, Session key construction
- Conversation Routing and Delivery: dmPolicy modes, Pairing-code approval, Numeric Telegram user ID normalization with telegram, allowFrom, Unauthorized DM, Group allowlists, Supergroup negative chat IDs, Forum topic session keys, ACP topic routing, Session key construction, Inbound media download, Voice notes, Location, Poll sending, Reactions, Text, Preview streaming, Reply threading tags, Durable outbound message recording, Voice notes, Poll sending, Reply threading tags, Durable outbound message recording
- Media and Rich Content: Inbound media download, Voice notes, Location, Poll sending, Reactions, Text, Preview streaming, Reply threading tags, Durable outbound message recording, Voice notes, Poll sending, Reply threading tags, Durable outbound message recording, Inbound media download, Voice notes, Location and venue extraction into channel context, Poll sending, Reactions
- Native Controls and Approvals: Inline keyboard rendering, Exec approvals in DMs, Message actions, Action capability discovery, Native setMyCommands startup sync, Command name/description normalization, Built-in commands, Command authorization in DMs, Model buttons, Native `setMyCommands` startup sync, Command name/description normalization, Built-in commands such as `/help`, Command authorization in DMs, Model buttons and command UI helpers

View File

@@ -1,12 +0,0 @@
# Observability Completeness
Use this rubric when assigning category Completeness scores for the
`telemetry-diagnostics-and-observability` surface.
## Category Scope
- Health and Repair: Background health-monitor loop, Per-account enable/disable settings, Startup grace, Restart logging, openclaw doctor, Structured health checks, Core doctor checks, Plugin SDK doctor/health contracts, openclaw status, openclaw health, Gateway RPC health, Cached health snapshots
- Logging: Rolling Gateway JSONL file logs, openclaw logs, Gateway RPC logs.tail, Redaction patterns and sinks, Trace correlation fields
- Diagnostic Collection: openclaw gateway diagnostics export, openclaw gateway stability --bundle, Chat /diagnostics, Support zip composition, Bounded in-process stability recorder, openclaw gateway stability, Memory pressure events, Critical memory pressure snapshot option
- Telemetry Export: Diagnostic event types, Async dispatch, W3C trace context creation, Plugin SDK diagnostic runtime exports, Model-call diagnostic events, diagnostics-otel plugin install, OTLP/HTTP traces, Trusted trace context, Model and runtime telemetry, diagnostics-prometheus plugin install, Gateway-authenticated GET /api/diagnostics/prometheus, Prometheus text exposition, Trusted diagnostic event subscription
- Session Diagnostics: session.state, Diagnostic session activity snapshots, Model usage, Export of session signals to stability

View File

@@ -1,12 +0,0 @@
# TUI Completeness
Use this rubric when assigning category Completeness scores for the
`tui-and-terminal-ux` surface.
## Category Scope
- Runtime Modes: Gateway TUI launch, Local chat launch, Terminal alias launch, Initial message launch, Launch option validation, Gateway connection, Gateway authentication, History load on attach, Reconnect visibility, Gateway command RPCs, Embedded local chat, Local auth flow, Config repair loop, Gateway-free recovery
- Input and Commands: Message composition, Input history, Keyboard shortcuts, Paste and busy-submit handling, IME and AltGr handling, Slash Commands, Pickers, Settings
- Session Management: Session Lifecycle, History, Resume
- Local Shell Execution: Bang-command routing, Approval prompt, Command output display, Execution environment marker
- Rendering and Output Safety: Streaming Message Rendering, Tool Cards, Terminal Rendering Primitives, Output Safety

View File

@@ -1,13 +0,0 @@
# Voice and realtime talk Completeness
Use this rubric when assigning category Completeness scores for the
`voice-and-realtime-talk` surface.
## Category Scope
- Talk Providers: OpenAI Realtime voice backend bridge, Google Gemini Live backend bridge, Realtime voice provider SDK contracts, Provider diagnostics, Talk catalog, Talk provider config, Shared native config parsing
- Realtime Talk Sessions: Agent consult handoff, Active Talk agent-run status, Talkback runtime behavior, Forced consult scheduling, Browser Talk start/stop UI, Browser WebRTC sessions, Browser relay mode, Browser tool-call forwarding, Realtime session controls, Gateway relay sessions, Audio-frame limits
- Speech and Transcription: Voice directives, Talk speech playback, Transcription relay sessions, Realtime transcription providers, Native directive parsing
- Native App Talk: macOS native Talk mode, iOS Talk mode, Android Talk mode, Shared Talk config
- Voice Wake and Routing: Wake-word settings, Wake routing, macOS Voice Wake runtime, Mobile wake preferences
- Talk Observability: Talk event logging, Session-log health, Live smoke output, Prometheus diagnostic counters, Operator visibility into setup

View File

@@ -1,12 +0,0 @@
# Voice Call channel Completeness
Use this rubric when assigning category Completeness scores for the
`voice-call-channel` surface.
## Category Scope
- Channel Setup and Operations: Voice Call Channel, Voice Call Channel, Voice Call Channel
- Access and Identity: Voice Call Channel
- Conversation Routing and Delivery: Voice Call Channel
- Media and Rich Content: Voice Call Channel, Voice Call Channel
- Realtime Voice and Calls: Voice Call Channel, Voice Call Channel, Voice Call Channel, Voice Call Channel, Voice Call Channel

View File

@@ -1,12 +0,0 @@
# watchOS companion surfaces Completeness
Use this rubric when assigning category Completeness scores for the
`watchos-companion-surfaces` surface.
## Category Scope
- Delivery and Recovery: APNs relay/direct registration as it affects, Silent push, Pending approval recovery IDs, Gateway-side iOS exec approval, iPhone-side WatchConnectivity transport, Watch-side receiver activation, Delivery fallback among reachable messages
- Exec Approvals: Watch exec approval prompt, Watch approval list/detail UI, iPhone-side prompt caching
- Distribution and Support: Watch app, Signing/profile variables, Public/support status, Changelog, Release metadata, Historical bug/regression themes relevant to scoring
- Notifications and Replies: watch.status, Payload normalization, Mirrored iOS notification fallback when watch, Watch action buttons from generic prompt, Watch-to-iPhone reply payloads, iPhone-side dedupe, Mirrored iOS notification action
- Watch App UI: Watch app entry point, Generic inbox, Persistent watch inbox state

View File

@@ -1,11 +0,0 @@
# Web search tools Completeness
Use this rubric when assigning category Completeness scores for the
`web-search-tools` surface.
## Category Scope
- Search Providers: API-backed providers, Keyless and self-hosted providers, Provider comparison and auto-detection, Provider-specific filters and extraction, Result normalization, OpenAI native web_search, Codex native web_search, Gemini grounding, Grok web grounding, Kimi web search, Provider-native citations, Model and filter routing, webSearchProviders, registerWebSearchProvider, webFetchProviders, registerWebFetchProvider, public-artifact loading, runtime resolution, contract tests
- Setup and Diagnostics: Provider credentials, Default provider selection, Credential repair, Status checks, Quota errors, Cache controls, Provider diagnostics, Retry and fallback, Operator repair
- Network Safety: Network Safety, SSRF, Redirects, Untrusted Content
- Tool Availability and Fetch: web_search exposure, web_fetch exposure, x_search exposure, group:web policy, disabled-state diagnostics, provider/model gating, URL fetch, HTML extraction, PDF/text extraction, Safe truncation, Content citation handoff

View File

@@ -1,12 +0,0 @@
# WhatsApp Completeness
Use this rubric when assigning category Completeness scores for the
`whatsapp` surface.
## Category Scope
- Channel Setup and Operations: Official @openclaw/whatsapp plugin metadata, openclaw plugin install whatsapp, Channel config schema, Baileys socket lifecycle, Operator troubleshooting, Baileys socket lifecycle, Operator troubleshooting for reconnect loops
- Access and Identity: QR login, Baileys multi-file auth persistence, DM pairing challenge, Multi-account/default-account resolution, Direct-message dmPolicy, Sender identity extraction, Privacy controls for plugin hooks, Direct-message `dmPolicy`, Sender identity extraction, Privacy controls for plugin hooks and
- Conversation Routing and Delivery: Group allowlists, Group session keys, Outbound text sends, Provider-accepted receipts, Outbound text sends, Provider-accepted receipts and durable delivery identifiers
- Media and Rich Content: Inbound media download, Outbound image
- Native Controls and Approvals: Native exec, Approver target resolution

View File

@@ -1,12 +0,0 @@
# Windows via WSL2 Completeness
Use this rubric when assigning category Completeness scores for the
`windows-via-wsl2` surface.
## Category Scope
- WSL Setup and Updates: WSL2 + Ubuntu installation, Node runtime, Linux install flow inside WSL2, WSL2 runtime boundary, WSL2 network-family requirements, Source install and build inside WSL2, openclaw update, npm/pnpm/git package-root, Managed systemd Gateway restart, Service metadata refresh, Package-manager caveats
- Gateway Service Lifecycle: Onboarded systemd install, Gateway service install, systemd user unit rendering, WSL-aware systemd unavailable hints, Doctor service repair, WSL user-service linger, Systemd availability after Windows boot, Windows startup task for WSL, Verification before Windows sign-in, Clear expectations around PC power
- Gateway Access and Exposure: Gateway token/password auth, Provider credentials, Gateway auth SecretRefs, Remote URL credential precedence, WSL virtual network, Windows portproxy setup, Windows Firewall rules, Reachable Gateway URLs, Loopback and LAN exposure, WSL2 IPv4 networking, Tailscale remote access
- Diagnostics and Repair: openclaw doctor, openclaw status, openclaw logs, SecretRef, WSL/systemd unavailable hints, Operator repair guidance after WSL2 service
- Browser and Control UI: WSL2 Gateway with Windows browser, Windows Control UI URL, Raw remote CDP to Windows Chrome, Host-local Chrome MCP, Browser profile cdpUrl, Layered diagnostics

View File

@@ -54,13 +54,6 @@ pnpm crabbox:run -- --help | sed -n '1,120p'
- For broad OpenClaw maintainer `pnpm` gates, prefer the repo wrapper with
`--provider blacksmith-testbox` or the repo Testbox helpers when the standing
Testbox policy applies.
- Cold Testbox acquisition and hydration often take tens of seconds. When broad
remote proof is likely, immediately start
`node scripts/crabbox-wrapper.mjs warmup --provider blacksmith-testbox --keep --timing-json`
in a background command session while inspecting, editing, and running
focused local tests. Poll later, reuse the returned `tbx_...` with
`--provider blacksmith-testbox --id <tbx_id>`, and stop it before handoff.
Do not warm speculatively when remote proof is unlikely.
- Always report the actual provider and id. `cbx_...` means AWS Crabbox;
`tbx_...` means Blacksmith Testbox through Crabbox. If the output only says
`blacksmith testbox list`, use `blacksmith testbox list --all` before

View File

@@ -1,51 +0,0 @@
---
name: discord-user-post
description: Post an approved message as the logged-in Discord user through the Discord desktop app. Use for release announcements or other direct user-authored Discord posts; not for OpenClaw channel sends, bots, webhooks, relays, agent sessions, or archive search.
---
# Discord User Post
Use `$computer-use` to operate `/Applications/Discord.app` in the user's
existing logged-in session. This workflow represents the user directly.
## Prepare
1. Draft the complete final message outside Discord.
2. Confirm the intended server and channel with the user when either is
ambiguous.
3. Open Discord and navigate to the exact destination without entering the
message.
4. Verify the visible server name, channel header, and logged-in account.
Do not infer the target from unrelated Discord content. Stop if Discord is not
logged in, the account is wrong, or the exact destination cannot be verified.
## Confirm and Post
Posting is representational communication. Follow the `$computer-use`
confirmation policy even when the user previously asked for an announcement:
1. Show the user the exact final body and verified destination.
2. Request action-time confirmation before typing into Discord.
3. After confirmation, enter the approved body unchanged.
4. Visually inspect the composed message and destination again.
5. Send once.
If the body or destination changes after confirmation, request confirmation
again before sending.
## Verify
- Confirm the message appears once, from the user's account, in the intended
channel.
- Report the server, channel, and visible send result.
- Do not edit, delete, react, or send a follow-up without the corresponding
user instruction and confirmation.
## Guardrails
- Never use `openclaw message`, an OpenClaw agent, a Discord bot, webhook, relay,
or token for this workflow.
- Never expose private Discord content or account details in public output.
- Never send a draft, partial message, duplicate, or unreviewed attachment.
- For Discord archive/history/search, use `$discrawl` instead.

View File

@@ -1,4 +0,0 @@
interface:
display_name: "Discord User Post"
short_description: "Post approved messages through the logged-in Discord app"
default_prompt: "Post this approved message as me through the logged-in Discord desktop app."

View File

@@ -12,14 +12,14 @@ content, ordering, grouping, and attribution discipline.
## Goal
Rebuild the target `CHANGELOG.md` version section from a complete, generated
history manifest, not stale draft notes. Produce grouped user-facing release
notes sorted by user interest while preserving every relevant issue/PR ref and
every human `Thanks @...` attribution.
Rewrite the target `CHANGELOG.md` version section from history, not from stale
draft notes. Produce grouped user-facing release notes sorted by user interest
while preserving every relevant issue/PR ref and every human `Thanks @...`
attribution.
## Inputs
- Target base version: `YYYY.M.PATCH`, without beta suffix.
- Target base version: `YYYY.M.D`, without beta suffix.
- Base tag: last reachable shipped release tag, usually the previous stable or
the previous beta train requested by the operator.
- Target ref: exact branch/SHA being released.
@@ -34,60 +34,20 @@ every human `Thanks @...` attribution.
- `git log --first-parent --date=iso-strict --pretty=format:'%h%x09%ad%x09%s' <base-tag>..<target-ref>`
- `git log --first-parent --grep='(#' --date=short --pretty=format:'%h%x09%ad%x09%s' <base-tag>..<target-ref>`
- also inspect `--since='24 hours ago'` when main moved during the release.
3. Generate the complete contribution record and editorial manifest before
writing grouped prose:
```bash
node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
--base <base-tag> \
--target <target-ref> \
--version <YYYY.M.PATCH> \
--manifest /tmp/openclaw-release-<YYYY.M.PATCH>.json \
--write-ledger
```
- the manifest is the required input to the rewrite, not an after-the-fact
audit; it contains every referenced PR, eligible contributor credit,
inline issue context, every direct commit, and an editorial-eligibility
classification for PRs and direct commits
- for a historical backfill, add `--seed-ref <pre-backfill-ref>` once so
contribution records from the prior changelog are retained even when an
older merged commit omitted its PR number; the verifier excludes records
for work reverted after the base tag, including beta work reverted before
the stable release
- source PR discovery combines merged GitHub commit associations with merged
PR references explicitly present in active commit subjects/bodies so
cherry-picks and squash commits remain accounted for. Resolve every
association page and exclude PRs merged after the target release commit
- read the manifest before editing `### Highlights`, `### Changes`, or
`### Fixes`; do not carry old grouped prose forward without re-auditing it
- inspect linked PRs/issues or diffs for ambiguous commits. Direct commits
are editorial input, not public ledger rows; infer material user outcomes
from subject, body, touched files, tests, and nearby commits
3. Read linked PRs/issues or diffs for ambiguous commits. Direct commits matter;
infer notes from subject, body, touched files, tests, and nearby commits.
4. Rewrite one stable-base section only:
- use `## YYYY.M.PATCH`
- use `## YYYY.M.D`
- do not create beta-specific headings
- do not leave a stale `## Unreleased` section above the target release
- if `Unreleased` contains release-bound notes, fold them into the target
section instead of deleting them
5. Section shape:
- `### Highlights`: 5-8 bullets, broad user wins first
- include only a clear user-visible capability or workflow unlock, a
material reliability/safety fix, a broad cross-surface improvement, or
a release-defining integration/compatibility milestone
- every highlight must say what changed for a user in one sentence; use
one user story per bullet and group its supporting PRs
- exclude tests, CI, refactors, docs, catalog churn, and implementation
detail unless the outcome is a material install/update, data-safety, or
widely visible user improvement
- `### Changes`: new capabilities and behavior changes
- `### Fixes`: user-facing fixes first, grouped by impact and surface
- group related changes/fixes by surface and user impact; avoid one bullet
per tiny commit when several commits tell one user-facing story
- `### Complete contribution record`: generated PR-first record after the
grouped prose; it is the exhaustive accounting surface, not a second
release summary
6. Preserve attribution:
- keep `#issue`, `(#PR)`, `Fixes #...`, and `Thanks @...`
- every human-authored merged PR represented by a user-facing entry needs
@@ -102,35 +62,17 @@ every human `Thanks @...` attribution.
- multiple `Thanks @...` handles in one bullet are expected; do not drop or
collapse contributor credit just because the note is grouped
- if one grouped bullet covers both direct commits and PRs, keep all PR refs
and thanks, plus any issue refs and human credit from the direct work
- issues remain normal inline `#NNN` references. Do not add a separate
linked-issues inventory. The generated PR record keeps source issues
inline as `Related #NNN` on the PR that shipped them
- when backfilling an older linked-issues inventory, preserve reporter
credit inline for every GitHub-confirmed closing PR relationship. Do not
infer a PR relationship from a generic cross-reference event, invent an
unrelated PR link for a standalone report, or recreate the retired
inventory
- the complete contribution record lists every merged source PR exactly once
as `**PR #NNN**`; source PRs include GitHub commit associations and merged
PR references explicitly present in active commit subjects/bodies. It
preserves author/co-author credit and any issue references in the original
title
- direct commits remain in the manifest with GitHub-resolved author,
co-author, issue, and editorial-eligibility data. They inform grouped
prose but are never rendered as a public `#### Direct commits` dump. Add
direct-commit credit to a grouped bullet only when it shares an explicit
closing issue reference or at least two distinctive subject terms
- the verifier rejects `docs`, `test`, `refactor`, `ci`, `build`, `chore`,
and `style` PRs in Highlights, Changes, or Fixes. Keep those internal
contributions in the complete PR record, but do not give them editorial
release-note space
- classify internal-only work from conventional prefixes and clear title
signals such as `QA`, `test`, `docs`, `refactor`, `lint`, or `CI`; an
untyped title is not automatically editorial
and thanks, plus any issue refs from the direct commits
- before finalizing, audit the final release-note body:
- extract all `#NNN` refs from the notes
- resolve which refs are PRs and collect human PR authors
- resolve issue refs used as bug/report refs and collect human reporters
- scan represented commits for `Co-authored-by`
- compare those handles to the final `Thanks @...` set
- fix every missing human credit or explicitly record why it is omitted
- do not add GHSA references, advisory IDs, or security advisory slugs to
changelog entries or GitHub release-note text unless explicitly requested
- never thank bots, `@claude`, `@openclaw`, `@clawsweeper`, or `@steipete`
- never thank bots, `@openclaw`, `@clawsweeper`, or `@steipete`
- do not use GitHub's release contributor count as the source of truth; the
changelog must carry the complete human credit set itself
7. Sorting preference:
@@ -149,50 +91,10 @@ every human `Thanks @...` attribution.
- if any compatibility `removeAfter` is on/before release date, resolve it
or explicitly record the blocker before shipping
10. Validate and ship:
- after the manifest-driven rewrite, regenerate and verify the complete
contribution record before committing:
```bash
node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
--base <base-tag> \
--target <target-ref> \
--version <YYYY.M.PATCH> \
--manifest /tmp/openclaw-release-<YYYY.M.PATCH>.json \
--write-ledger
```
- the command fails when any `#NNN` reference in release history or the
rendered release section cannot resolve, when reverted work is presented
as shipped, when a source PR is absent from the contribution record, when
direct commits are rendered as a public record dump, when non-editorial
PRs appear in grouped prose, or when an eligible PR author or known
co-author is missing from that PR's `Thanks @...` credit
- when grouped prose names a PR, that same bullet must retain every
contributor and linked-reporter credit from its generated PR record
- unqualified `#NNN` references resolve against `openclaw/openclaw`;
cross-repository references such as `openclaw/imsg#141` remain literal
text and must not be rewritten as local issue links
- after the GitHub release or prerelease is published, verify every matching
release page against the same source section:
```bash
node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
--base <base-tag> \
--target <target-ref> \
--version <YYYY.M.PATCH> \
--release-tag v<YYYY.M.PATCH> \
--check-github
```
- add one `--release-tag` for every beta and stable page in the train; a
`### Release verification` tail is permitted, but any other body drift
fails the check; the GitHub body must begin with the complete
`## YYYY.M.PATCH` changelog section, including its heading
- GitHub release bodies are limited to 125,000 characters. If the complete
source section plus an existing verification tail exceeds that limit, keep
the source section intact and omit the tail; never truncate the
contribution record
- `git diff --check`
- for docs/changelog-only changes, no broad tests are required
- commit with `scripts/committer "docs(changelog): refresh YYYY.M.PATCH notes" CHANGELOG.md`
- push, pull/rebase if needed, then branch/rebase release from latest `main`
- `git diff --check`
- for docs/changelog-only changes, no broad tests are required
- commit with `scripts/committer "docs(changelog): refresh YYYY.M.D notes" CHANGELOG.md`
- push, pull/rebase if needed, then branch/rebase release from latest `main`
## Quota / API Outage Rule

View File

@@ -284,7 +284,7 @@ gh search issues --repo openclaw/openclaw --match title,body --limit 50 \
- If bot review conversations exist on your PR, address them and resolve them yourself once fixed.
- Leave a review conversation unresolved only when reviewer or maintainer judgment is still needed.
- Before landing any PR with non-trivial code changes, run `$autoreview` until no accepted/actionable findings remain, unless equivalent manual review already covered it, the change is trivial/docs-only, or the user opts out.
- When an agent is landing or merging a PR targeting `main`, use only the repo-native `scripts/pr` wrapper: run `scripts/pr review-init <PR>`, follow its emitted checkout/guard guidance, initialize and complete review artifacts with `scripts/pr review-artifacts-init <PR>`, validate them with `scripts/pr review-validate-artifacts <PR>`, then run `scripts/pr prepare-run <PR>` and `scripts/pr merge-run <PR>`.
- When landing or merging any PR, follow the global `/landpr` process.
- Use `scripts/committer "<msg>" <file...>` for scoped commits instead of manual `git add` and `git commit`.
- Keep commit messages concise and action-oriented.
- Group related changes; avoid bundling unrelated refactors.

View File

@@ -13,7 +13,7 @@ Use this skill for `qa-lab` / `qa-channel` work. Repo-local QA only.
- `docs/help/testing.md`
- `docs/channels/qa-channel.md`
- `qa/README.md`
- `qa/scenarios/index.yaml`
- `qa/scenarios/index.md`
- `extensions/qa-lab/src/suite.ts`
- `extensions/qa-lab/src/character-eval.ts`
@@ -198,9 +198,7 @@ pnpm openclaw qa character-eval \
- Judges default to `openai/gpt-5.4,thinking=xhigh,fast` and `anthropic/claude-opus-4-6,thinking=high`.
- Report includes judge ranking, run stats, durations, and full transcripts; do not include raw judge replies. Duration is benchmark context, not a grading signal.
- Candidate and judge concurrency default to 16. Use `--concurrency <n>` and `--judge-concurrency <n>` to override when local gateways or provider limits need a gentler lane.
- Scenario source is YAML-only under `qa/scenarios/`: use `index.yaml` and
per-scenario `*.yaml` files with top-level `title`, `scenario`, and optional
`flow`. Never add fenced `qa-scenario` / `qa-flow` Markdown files.
- Scenario source should stay markdown-driven under `qa/scenarios/`.
- For isolated character/persona evals, write the persona into `SOUL.md` and blank `IDENTITY.md` in the scenario flow. Use `SOUL.md + IDENTITY.md` only when intentionally testing how the normal OpenClaw identity combines with the character.
- Keep prompts natural and task-shaped. The candidate model should receive character setup through `SOUL.md`, then normal user turns such as chat, workspace help, and small file tasks; do not ask "how would you react?" or tell the model it is in an eval.
- Prefer at least one real task, such as creating or editing a tiny workspace artifact, so the transcript captures character under normal tool use instead of pure roleplay.
@@ -236,8 +234,7 @@ pnpm openclaw qa manual \
## Repo facts
- Seed scenarios live in `qa/scenarios/index.yaml` and
`qa/scenarios/<theme>/*.yaml`.
- Seed scenarios live in `qa/`.
- Main live runner: `extensions/qa-lab/src/suite.ts`
- QA lab server: `extensions/qa-lab/src/lab-server.ts`
- Child gateway harness: `extensions/qa-lab/src/gateway-child.ts`
@@ -265,9 +262,8 @@ pnpm openclaw qa manual \
## When adding scenarios
- Add or update scenario YAML under `qa/scenarios/`; do not add `.md` scenario
files or fenced YAML blocks.
- Keep kickoff expectations in `qa/scenarios/index.yaml` aligned
- Add or update scenario markdown under `qa/scenarios/`
- Keep kickoff expectations in `qa/scenarios/index.md` aligned
- Add executable coverage in `extensions/qa-lab/src/suite.ts`
- Prefer end-to-end assertions over mock-only checks
- Save outputs under `.artifacts/qa-e2e/`

View File

@@ -1,8 +1,6 @@
#!/usr/bin/env node
/**
* Secret scanning alert handler for OpenClaw maintainers.
* Usage: node secret-scanning.mjs <command> [options]
*/
// Secret scanning alert handler for OpenClaw maintainers.
// Usage: node secret-scanning.mjs <command> [options]
import { spawnSync } from "node:child_process";
import crypto from "node:crypto";
@@ -59,7 +57,6 @@ function isBodyLocationType(locationType) {
return locationType === "issue_body" || locationType === "pull_request_body";
}
/** Decides whether redacting an issue/PR body requires notifying the reporter. */
export function decideBodyRedaction(currentBody, redactedBody) {
const bodyChanged = String(currentBody) !== String(redactedBody);
return {
@@ -68,7 +65,6 @@ export function decideBodyRedaction(currentBody, redactedBody) {
};
}
/** Loads redaction-result metadata for issue/PR body secret locations. */
export function loadBodyRedactionResult(locationType, resultFile) {
if (!isBodyLocationType(locationType)) {
return { notify_required: true };

View File

@@ -1,7 +1,4 @@
#!/usr/bin/env node
/**
* Heap snapshot diff utility for OpenClaw test memory leak investigations.
*/
import fs from "node:fs";
import path from "node:path";

View File

@@ -6,8 +6,7 @@ description: "Draft or post OpenClaw beta/stable Discord release announcements f
# OpenClaw Release Announcement
Use with `release-openclaw-maintainer` after a beta or stable release is live.
Use with `$discord-user-post` when actually posting to Discord as the logged-in
user.
Use with `openclaw-discord` when actually posting to Discord.
## Evidence First
@@ -81,7 +80,6 @@ Fresh installs still point to `https://openclaw.ai`.
## Posting
When asked to post, use `$discord-user-post` to operate the logged-in Discord
desktop app as the user. Resolve and visibly verify the exact server/channel,
inspect the final body, and request action-time confirmation before entering or
sending it. Never use OpenClaw channel sends, bots, webhooks, relays, or tokens.
When asked to post, use the configured Discord workflow from
`openclaw-discord` or the approved OpenClaw relay. Never print tokens.
For public channels, inspect the final body before sending.

View File

@@ -16,33 +16,10 @@ Use this with `$release-openclaw-maintainer` and `$openclaw-testing` when a rele
- Watch one parent run plus compact child summaries. Avoid broad `gh run view` polling loops; REST quota is easy to burn.
- Fetch logs only for failed or currently-blocking jobs. If quota is low, stop polling and wait for reset.
- Treat live-provider flakes separately from code failures: prove key validity, provider HTTP status, retry evidence, and exact failing lane before editing code.
- A model-list response proves authentication, not billing or inference
entitlement. Mandatory live providers must pass a real completion probe
before release dispatch. Fix the credential first; do not add an alternate
auth path merely to bypass a failed release credential.
- Full Release Validation parent monitors fail fast: once a required child job
fails, the parent cancels the remaining child matrix and prints the failed
job summary. Inspect that first red job instead of waiting for unrelated
matrix tails.
- In a sparse worktree or Testbox source sync, first confirm `package.json`,
`pnpm-lock.yaml`, and every source path the selected check reads. If any are
absent, that checkout cannot validate a release dependency or Docker lane:
stop and use the repo remote changed gate or a full task worktree. When the
inputs are present and a release fix changes `package.json` or
`pnpm-lock.yaml`, rebuild only the task-owned disposable box with
`CI=true pnpm install --frozen-lockfile`, then run an explicit
`require.resolve()` probe before Docker or focused tests. The CI flag permits
pnpm to recreate a prewarmed modules directory without an interactive
confirmation. Do not weaken the lockfile or label sparse-checkout failures
as product/Docker failures.
- If the candidate is rebased or its base SHA changes after warmup, stop the
task-owned box and warm a fresh one before testing. Testbox source sync is
relative to the warmed source tree; continuing can mix an old base file with
a new candidate diff and produce false lockfile or Docker failures.
- For a committed release candidate, warm the box with
`blacksmith testbox warmup ... --ref <candidate-branch-or-sha>`. Do not rely
on source sync to overlay committed branch changes onto the workflow's
default ref.
## Preflight
@@ -59,8 +36,6 @@ git rev-parse HEAD
preflight. Inject those exact targeted keys first, then run the verifier; use
ambient env only when it was already intentionally injected for this release.
The script prints only provider status and HTTP class, never tokens.
The Anthropic check performs a tiny message completion so exhausted or
non-billable credentials fail before the expensive release matrix.
## Dispatch
@@ -76,7 +51,7 @@ gh workflow run openclaw-performance.yml \
-f repeat=3 \
-f deep_profile=false \
-f live_openai_candidate=false \
-f fail_on_regression=true
-f fail_on_regression=false
```
- Do not wait for full release validation to start this early perf signal.
@@ -85,19 +60,11 @@ gh workflow run openclaw-performance.yml \
- Call out any regression in the release proof. Treat a major regression as a
release blocker until it is fixed, waived by the operator, or proven to be
infrastructure noise.
- Full Release Validation records blocking product-performance evidence. The
early standalone run is for overlap and faster regression discovery, but a
regression or missing child run blocks the parent validation.
- Full Release Validation also records advisory product-performance evidence;
the early standalone run is for overlap and faster regression discovery.
Prefer the trusted workflow on `main`, target the exact release SHA:
- Keep trusted-workflow checks compatible with frozen release targets. If
`main` adds a target-owned guard script or package command after the release
branch cut, make the trusted workflow skip only when that target surface is
absent. Heal the trusted workflow before rerunning validation; do not port an
unrelated runtime refactor or mutate the release candidate just to satisfy a
newer `main`-only check.
```bash
gh workflow run full-release-validation.yml \
--repo openclaw/openclaw \
@@ -109,7 +76,7 @@ gh workflow run full-release-validation.yml \
-f rerun_group=all
```
Use `release_profile=stable` unless the operator explicitly asks for the broad advisory provider/media matrix. Stable and full profiles force the release soak; the beta profile may opt in with `run_release_soak=true`. Use narrow `rerun_group` after focused fixes.
Use `release_profile=stable` unless the operator explicitly asks for the broad advisory provider/media matrix. Use narrow `rerun_group` after focused fixes.
Publish with `openclaw-release-publish.yml` using `release_profile=from-validation`
unless a maintainer intentionally wants to cross-check a specific profile; the
publish workflow reads the effective profile from the full-validation manifest.
@@ -139,25 +106,9 @@ Stop watchers before ending the turn or switching strategy.
--jq '.jobs[] | select(.conclusion=="failure" or .conclusion=="timed_out" or .conclusion=="cancelled") | [.databaseId,.name,.conclusion,.url] | @tsv'
```
3. Fetch one failed job log. If rate-limited, note reset time and avoid more REST calls.
4. For secret-looking failures, validate a real completion from the same secret source before editing code. A successful model-list request is insufficient.
Claude CLI subscription credentials are a separate native auth path; prove
them in a clean-home CLI probe, never as a substitute for a required
Anthropic API-key lane.
4. For secret-looking failures, validate the provider endpoint from the same secret source before editing code.
5. For live-cache failures, inspect whether it is missing/invalid key, empty text, provider refusal, timeout, or baseline miss. Do not weaken release gates without clear provider evidence.
6. Fix narrowly, run local/changed proof, commit, push, rerun the smallest matching group.
7. If a required PR CI run is capacity-stalled with queued jobs and no active
jobs, do not cancel unrelated work or accept a generic manual dispatch.
From the PR head branch, dispatch the explicit exact-SHA fallback:
`gh workflow run ci.yml --repo openclaw/openclaw --ref <pr-head-branch> -f
target_ref=<full-pr-sha> -f include_android=true -f release_gate=true`.
It runs on GitHub-hosted runners and is accepted only when its run title is
`CI release gate <full-pr-sha>`. Record the stalled Blacksmith run and the
fallback run in release evidence.
If `Blacksmith Build Artifacts Testbox` is the only remaining required gate
and remains queued without a runner, that completed exact fallback may cover
it because CI's `build-artifacts` job already builds, packages, and smoke
tests the artifacts. Do not use this coverage after the artifact workflow
starts or completes non-successfully.
## Evidence

View File

@@ -1,8 +1,4 @@
#!/usr/bin/env node
/**
* Release CI summary helper that prints parent and child workflow status for a
* full release run.
*/
import { execFileSync } from "node:child_process";
import process from "node:process";

View File

@@ -1,22 +1,13 @@
#!/usr/bin/env node
/**
* Release preflight helper that verifies required provider API keys without
* printing secret values. Anthropic must complete a prompt because model-list
* access does not prove billing or inference entitlement.
*/
import process from "node:process";
const args = new Map();
for (let index = 2; index < process.argv.length; index += 1) {
const arg = process.argv[index];
if (!arg.startsWith("--")) {
continue;
}
if (!arg.startsWith("--")) continue;
const [key, inlineValue] = arg.slice(2).split("=", 2);
const value = inlineValue ?? process.argv[index + 1];
if (inlineValue === undefined) {
index += 1;
}
if (inlineValue === undefined) index += 1;
args.set(key, value);
}
@@ -33,9 +24,7 @@ const timeoutMs = Number(args.get("timeout-ms") ?? 10_000);
function envFirst(names) {
for (const name of names) {
const value = process.env[name]?.trim();
if (value) {
return { name, value };
}
if (value) return { name, value };
}
return undefined;
}
@@ -51,19 +40,13 @@ async function checkProvider(id, config) {
try {
const headers = config.headers(secret.value);
const response = await fetch(config.url, {
body: config.body,
headers,
method: config.method,
signal: controller.signal,
});
const responseBody = config.validateResponse
? await response.json().catch(() => undefined)
: undefined;
const ok = response.ok && (!config.validateResponse || config.validateResponse(responseBody));
return {
id,
ok,
status: response.ok ? (ok ? "ok" : "invalid_response") : `http_${response.status}`,
ok: response.ok,
status: response.ok ? "ok" : `http_${response.status}`,
env: secret.name,
};
} catch (error) {
@@ -86,21 +69,11 @@ const providers = {
},
anthropic: {
env: ["ANTHROPIC_API_KEY", "ANTHROPIC_API_TOKEN"],
url: "https://api.anthropic.com/v1/messages",
method: "POST",
body: JSON.stringify({
max_tokens: 8,
messages: [{ role: "user", content: "Reply with OK." }],
model: "claude-haiku-4-5",
}),
url: "https://api.anthropic.com/v1/models",
headers: (token) => ({
"anthropic-version": "2023-06-01",
"content-type": "application/json",
"x-api-key": token,
}),
validateResponse: (body) =>
Array.isArray(body?.content) &&
body.content.some((part) => typeof part?.text === "string" && part.text.trim()),
},
fireworks: {
env: ["FIREWORKS_API_KEY"],
@@ -131,9 +104,7 @@ let failed = false;
for (const result of results) {
const requiredLabel = required.has(result.id) ? "required" : "optional";
console.log(`${result.id}: ${result.status} env=${result.env} ${requiredLabel}`);
if (required.has(result.id) && !result.ok) {
failed = true;
}
if (required.has(result.id) && !result.ok) failed = true;
}
if (failed) {

View File

@@ -36,8 +36,8 @@ Do not update these from mixed sources. All three ASC fields must come from the
## Workflow Shape
- Public release branch may carry mac-only packaging fixes after the stable tag/npm are already live.
- Use `source_ref=release/YYYY.M.PATCH` for private mac preflight/validation when building that branch variation.
- Keep `tag=vYYYY.M.PATCH` pointing at the original stable release commit.
- Use `source_ref=release/YYYY.M.D` for private mac preflight/validation when building that branch variation.
- Keep `tag=vYYYY.M.D` pointing at the original stable release commit.
- Real mac publish must reuse:
- a successful private mac preflight run for the same tag/source SHA
- a successful private mac validation run for the same tag/source SHA
@@ -56,37 +56,37 @@ Private preflight:
```bash
gh workflow run openclaw-macos-publish.yml --repo openclaw/releases-private --ref main \
-f tag=vYYYY.M.PATCH \
-f source_ref=release/YYYY.M.PATCH \
-f tag=vYYYY.M.D \
-f source_ref=release/YYYY.M.D \
-f preflight_only=true \
-f smoke_test_only=false \
-f allow_late_calver_recovery=false \
-f public_release_branch=release/YYYY.M.PATCH
-f public_release_branch=release/YYYY.M.D
```
Private validation for a branch-variation preflight:
```bash
gh workflow run openclaw-macos-validate.yml --repo openclaw/releases-private --ref main \
-f tag=vYYYY.M.PATCH \
-f source_ref=release/YYYY.M.PATCH
-f tag=vYYYY.M.D \
-f source_ref=release/YYYY.M.D
```
Real publish:
```bash
gh workflow run openclaw-macos-publish.yml --repo openclaw/releases-private --ref main \
-f tag=vYYYY.M.PATCH \
-f tag=vYYYY.M.D \
-f preflight_only=false \
-f smoke_test_only=false \
-f preflight_run_id=<successful-preflight-run> \
-f validate_run_id=<successful-validation-run> \
-f allow_late_calver_recovery=false \
-f public_release_branch=release/YYYY.M.PATCH
-f public_release_branch=release/YYYY.M.D
```
## Verify
- `gh release view vYYYY.M.PATCH --repo openclaw/openclaw` shows zip, dmg, dSYM zip, not draft, not prerelease.
- Public `main` `appcast.xml` points at `OpenClaw-YYYY.M.PATCH.zip`.
- `gh release view vYYYY.M.D --repo openclaw/openclaw` shows zip, dmg, dSYM zip, not draft, not prerelease.
- Public `main` `appcast.xml` points at `OpenClaw-YYYY.M.D.zip`.
- Appcast entry has `sparkle:version`, `sparkle:shortVersionString`, length, and `sparkle:edSignature`.

View File

@@ -10,19 +10,12 @@ Use this skill for release and publish-time workflow. Load `$release-private` if
## Respect release guardrails
- Do not change version numbers without explicit operator approval.
- Versions use `YYYY.M.PATCH`, where `PATCH` is the sequential release-train number within the month, not the calendar day.
- Choose a new beta train from stable and beta releases only. Alpha-only tags do not consume or advance the beta/stable patch number. Continue the highest existing unpublished/published beta train with the next `beta.N` when appropriate; otherwise increment the highest stable/beta patch by one and start at `beta.1`.
- Example: after stable `2026.6.5`, the next new beta train is `2026.6.6-beta.1`, even if automated alpha-only tags such as `2026.6.10-alpha.1` exist.
- Ask permission before any npm publish or release step.
- This skill should be sufficient to drive the normal release flow end-to-end.
- Use the private maintainer release docs for credentials, recovery steps, and mac signing/notary specifics, and use `docs/reference/RELEASING.md` for public policy.
- Core `openclaw` publish is manual `workflow_dispatch`; creating or pushing a tag does not publish by itself.
- Do not edit the root `README.md` as release prep, release closeout, or a
substitute for release notes. Package-root README validation is a hard
packaging gate, but a release only changes README content when an actual
user-facing documentation contract changed.
- Normal release work happens on a branch cut from `main`, not directly on
`main`. Use `release/YYYY.M.PATCH` for the branch name.
`main`. Use `release/YYYY.M.D` for the branch name.
- If the operator asks for a release without saying stable/full, default to
beta only. Continue from beta to stable only when the operator explicitly asks
for the full release or an automated beta-and-stable train.
@@ -80,44 +73,6 @@ Use this skill for release and publish-time workflow. Load `$release-private` if
or clawgrit reports. Report regressions explicitly. A major regression is a
release blocker unless the operator waives it or the data clearly proves
infrastructure noise.
- Heal CI before tagging or publishing. The exact candidate SHA must have green
`Full Release Validation`, including the root Dockerfile/install-smoke path.
Treat a red Docker, package, or release workflow lane as a release-branch
defect until the smallest correct fix is landed and proven; do not waive it
because npm preflight or another sibling lane passed.
- Keep the canonical `scripts/pr` runner authoritative for prepare and merge
artifacts. A release-gate policy change may use focused candidate tests and
exact-SHA hosted CI for proof, but never route `prepare-*` or `merge-*`
through PR-controlled scripts or synthesize prepare artifacts to bootstrap
the change. If the current canonical gate cannot validate the new policy,
stop for explicit maintainer direction rather than weakening that boundary.
- In maintainer Testbox mode, use `OPENCLAW_TESTBOX=1 scripts/pr prepare-run
<PR>` only after the exact PR head has passed `CI` and every scheduled
hosted gate. For a workflow change, that means `Blacksmith Testbox`,
`Blacksmith ARM Testbox`, `Blacksmith Build Artifacts Testbox`, and
`Workflow Sanity`; only gates GitHub actually scheduled for that exact head
are required. This preserves the canonical prepare artifacts while avoiding
a redundant broad local suite. A
literal `CHANGELOG.md`-only head gets a clean diff check instead because
those workflows intentionally do not dispatch. Documentation and README
changes still require CI. If `merge-run` requires a mainline sync, run
`OPENCLAW_TESTBOX=1 scripts/pr prepare-sync-head <PR>`, wait for those hosted
gates on the newly pushed SHA, then run `prepare-run` again.
- If an exact PR-head CI run has no active jobs because Blacksmith capacity is
stalled, a maintainer may dispatch the explicit GitHub-hosted fallback from
the PR head branch:
`gh workflow run ci.yml --repo openclaw/openclaw --ref <pr-head-branch> -f
target_ref=<full-pr-sha> -f include_android=true -f release_gate=true`.
Use it only for an observed provider queue stall, never for failed CI or as a
routine shortcut. The run must be named `CI release gate <full-pr-sha>` and
pass on that exact SHA; the native hosted-gate verifier rejects generic manual
CI runs. If `Blacksmith Build Artifacts Testbox` is the only remaining
required gate and it is still queued without a runner, the same completed
fallback CI may cover it because its `build-artifacts` job builds, packages,
and smoke tests those artifacts. The verifier records that coverage. Never
use this coverage when the artifact workflow has started, failed, been
cancelled, or been skipped. Then rerun `OPENCLAW_TESTBOX=1 scripts/pr
prepare-run <PR>`.
- Generate the changelog before every beta, beta rerun, stable release, or
stable rerun, before version/tag preparation. Use
`$openclaw-changelog-update` for the rewrite. Do not continue release prep if
@@ -137,39 +92,11 @@ prepare-run <PR>`.
## Keep release channel naming aligned
- `stable`: tagged releases only, published to npm `beta` by default; operators may target npm `latest` explicitly or promote later
- `beta`: prerelease tags like `vYYYY.M.PATCH-beta.N`, with npm dist-tag `beta`
- `beta`: prerelease tags like `vYYYY.M.D-beta.N`, with npm dist-tag `beta`
- Prefer `-beta.N`; do not mint new `-1` or `-2` beta suffixes
- `dev`: moving head on `main`
- When using a beta Git tag, publish npm with the matching beta version suffix so the plain version is not consumed or blocked
## Close stable releases on main
Stable publication is not complete until `main` carries the actual shipped release state.
1. Start from fresh latest `main`. Audit `release/YYYY.M.PATCH` against it and
forward-port real fixes that are absent from `main`. Do not blindly merge
release-only compatibility, test, or validation adapters into newer `main`.
2. Set `main` to the shipped stable version, not a speculative next train. Run
`pnpm release:prep` after the root version change, then
`pnpm deps:shrinkwrap:generate`.
3. Make `CHANGELOG.md`'s `## YYYY.M.PATCH` section on `main` exactly match the
tagged release branch. Include the stable `appcast.xml` update when the mac
release published one.
4. Do not add `YYYY.M.PATCH+1`, a beta version, or an empty future changelog
section to `main` until the operator explicitly starts that release train.
5. Run `pnpm release:generated:check`, `pnpm deps:shrinkwrap:check`, and
`OPENCLAW_TESTBOX=1 pnpm check:changed`. Push, then verify `origin/main`
contains the shipped version and changelog before calling the stable release
done.
6. Keep repository variables `RELEASE_ROLLBACK_DRILL_ID` and
`RELEASE_ROLLBACK_DRILL_DATE` current after each private rollback drill.
`openclaw-stable-main-closeout.yml` starts from the `main` push carrying the
shipped version, changelog, and appcast after stable publication, then binds
immutable evidence to the published tag. Do not declare stable complete
until it writes the immutable closeout manifest to the GitHub release. The
drill must be within 90 days; manual dispatch is only for repair/replay, and
private rollback commands remain in the maintainer-only runbook.
## Handle versions and release files consistently
- Version locations include:
@@ -181,13 +108,12 @@ Stable publication is not complete until `main` carries the actual shipped relea
- `docs/install/updating.md`
- Peekaboo Xcode project and plist version fields
- Before creating a release tag, make every version location above match the version encoded by that tag.
- For fallback correction tags like `vYYYY.M.PATCH-N`, the repo version locations still stay at `YYYY.M.PATCH`.
- For fallback correction tags like `vYYYY.M.D-N`, the repo version locations still stay at `YYYY.M.D`.
- “Bump version everywhere” means all version locations above except `appcast.xml`.
- Release signing and notary credentials live outside the repo in the private maintainer docs.
- Every stable OpenClaw release ships the npm package, macOS app, and signed
Windows Hub installers together. Beta releases normally ship npm/package
artifacts first and skip native app build/sign/notarize/promote unless the
operator requests native beta validation.
- Every stable OpenClaw release ships the npm package and macOS app together.
Beta releases normally ship npm/package artifacts first and skip mac app
build/sign/notarize unless the operator requests mac beta validation.
- Do not let the slower macOS signing/notary path block npm publication once
the npm preflight has passed. Keep mac validation/publish running in
parallel, publish npm from the successful npm preflight, then start published
@@ -202,44 +128,21 @@ Stable publication is not complete until `main` carries the actual shipped relea
tagged commit when the delta is mac packaging, signing, workflow, or
validation-only release machinery. If mac packaging needs release-branch-only
fixes after the stable npm package or GitHub tag is already published, do not
create a `vYYYY.M.PATCH-N` correction tag just to change the workflow source.
Dispatch the private mac workflows for the original `tag=vYYYY.M.PATCH` with
`source_ref=release/YYYY.M.PATCH` and `public_release_branch=release/YYYY.M.PATCH`;
create a `vYYYY.M.D-N` correction tag just to change the workflow source.
Dispatch the private mac workflows for the original `tag=vYYYY.M.D` with
`source_ref=release/YYYY.M.D` and `public_release_branch=release/YYYY.M.D`;
provenance checks must prove the source SHA descends from the tag and
validation/preflight use the same source. Reserve `vYYYY.M.PATCH-N` correction
validation/preflight use the same source. Reserve `vYYYY.M.D-N` correction
tags for emergency hotfixes that must publish a new npm package/release
identity, not for ordinary mac-only packaging recovery.
- The production Sparkle feed lives at `https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml`, and the canonical published file is `appcast.xml` on `main` in the `openclaw` repo.
- That shared production Sparkle feed is stable-only. Beta mac releases may
upload assets to the GitHub prerelease, but they must not replace the shared
`appcast.xml` unless a separate beta feed exists.
- For fallback correction tags like `vYYYY.M.PATCH-N`, the repo version still stays
at `YYYY.M.PATCH`, but the mac release must use a strictly higher numeric
- For fallback correction tags like `vYYYY.M.D-N`, the repo version still stays
at `YYYY.M.D`, but the mac release must use a strictly higher numeric
`APP_BUILD` / Sparkle build than the original release so existing installs
see it as newer.
- Stable Windows Hub release closeout requires the signed
`OpenClawCompanion-Setup-x64.exe`, `OpenClawCompanion-Setup-arm64.exe`, and
`OpenClawCompanion-SHA256SUMS.txt` assets on the canonical
`openclaw/openclaw` GitHub Release. Pass the exact signed
`openclaw/openclaw-windows-node` release tag as `windows_node_tag` to
`OpenClaw Release Publish`, together with the candidate-approved
`windows_node_installer_digests` map; it prevalidates the published source
release and required installers against that map before any publish child,
dispatches the public `Windows Node Release` workflow while the OpenClaw
release is still a draft, carries those pinned source asset digests
unchanged, verifies the expected OpenClaw Foundation Authenticode signer on
Windows, re-downloads and checksum-verifies the promoted asset contract, and
blocks publication until the canonical asset contract is present. Use direct
`Windows Node Release` dispatch only for recovery, always with an exact tag,
never `latest`, and the explicit `expected_installer_digests` JSON map from
the approved source release. Recovery rejects unexpected
`OpenClawCompanion-*` target asset names, then replaces the expected contract
assets with the pinned source bytes.
- Website Windows Hub download links should target exact canonical
`openclaw/openclaw/releases/download/vYYYY.M.PATCH/...` assets for the current
stable release, or `releases/latest/download/...` only after verifying the
redirect resolves to that same tag, so the installable signed Windows artifact
is visible from both the GitHub release page and openclaw.ai.
## Build changelog-backed release notes
@@ -249,20 +152,12 @@ Stable publication is not complete until `main` carries the actual shipped relea
section from history, not existing notes. Use the last reachable stable or
beta release tag as the base, then inspect every commit through the target
release SHA.
- Generate `$openclaw-changelog-update`'s full contribution manifest before
the editorial rewrite. It is the required source for `### Highlights`,
`### Changes`, and `### Fixes`; do not preserve old grouped prose without
comparing it to the manifest's PRs, contributors, direct commits, and
unlinked commits.
- The changelog rewrite is not optional for beta reruns: any `beta.N` after a
rebase or backport must refresh the same stable-base `## YYYY.M.PATCH` section
rebase or backport must refresh the same stable-base `## YYYY.M.D` section
before the new version/tag commit.
- Include both merged PR commits and direct commits on `main`. Direct commits
matter: infer notes from their subject, body, touched files, linked issues,
tests, and nearby code when no PR body exists.
- Keep direct commits in the generated manifest and use them to shape grouped
user outcomes, but never dump them into `CHANGELOG.md` or GitHub release
bodies. The public complete record is PR-first and exhaustive for PRs.
- Prefer PR bodies, issue links, review proof, and commit bodies over commit
subjects alone. If a commit fixed an issue directly, the commit body should
name the user-visible behavior, affected surface, issue ref, and credited
@@ -278,43 +173,11 @@ Stable publication is not complete until `main` carries the actual shipped relea
`#issue`, `(#PR)`, `Fixes #...`, and every human `Thanks @...` handle.
Multiple thanks in one bullet are expected when multiple contributor PRs are
grouped.
- Highlights earn their place only when they are a visible capability/workflow
unlock, a material reliability or safety repair, a broad user-facing
improvement, or a release-defining integration/compatibility change. Keep
five to eight user-outcome bullets; omit tests, CI, refactors, docs, and
implementation trivia unless their outcome materially affects users.
- Do not give `docs`, `test`, `refactor`, `ci`, `build`, `chore`, or `style`
PRs/direct commits their own Highlights, Changes, or Fixes entry. They remain
accounted for in the PR record or manifest, but are not product release
content. Treat explicit internal title signals such as `QA`, `lint`, or
`testing` the same way even when the PR has no conventional prefix.
- Use the generated `### Complete contribution record` as PR-first accounting:
every merged source PR appears once with author/co-author credit, including
PRs identified only by an explicit active-commit `#NNN` reference after a
cherry-pick or squash. Keep issues inline as `#NNN` in titles and grouped
prose; do not create a linked-issues inventory or a direct-commit listing.
When grouped prose names a PR, keep every contributor and linked-reporter
credit from that PR's record on the same bullet.
- Changelog entries should be user-facing, not internal release-process notes.
- GitHub release and prerelease bodies must use the full matching
`CHANGELOG.md` version section, not highlights or an excerpt. When creating
or editing a release, extract from `## YYYY.M.PATCH` through the line before the
or editing a release, extract from `## YYYY.M.D` through the line before the
next level-2 heading and use that complete block as the release notes.
- GitHub limits release bodies to 125,000 characters. If a historical
`### Release verification` tail would exceed that cap, omit the tail and keep
the complete changelog section; do not truncate the contribution record.
- Before publishing or closing a release, run
`$openclaw-changelog-update`'s `verify-release-notes.mjs` with every stable
and beta release tag in the train. Do not publish or leave a page live when
it is missing a source-history reference, eligible human credit, or the
complete matching changelog body.
- To update an existing GitHub Release body, resolve the numeric release id and
patch that resource with the notes file as the `body` field:
`gh api repos/openclaw/openclaw/releases/tags/vYYYY.M.PATCH --jq .id`, then
`gh api -X PATCH repos/openclaw/openclaw/releases/<id> -F body=@/tmp/notes.md`.
Do not trust `gh release edit --notes-file` or `--input` JSON if verification
disagrees; verify with `gh api repos/openclaw/openclaw/releases/<id>` because
the tag lookup and `gh release view` can lag or show stale body text.
- When preparing release notes, scan `src/plugins/compat/registry.ts` and
`src/commands/doctor/shared/deprecation-compat.ts` for compatibility records
with `warningStarts` or `removeAfter` within 7 days after the release date.
@@ -323,10 +186,10 @@ Stable publication is not complete until `main` carries the actual shipped relea
record's `docsPath` or `/plugins/compatibility` when no more specific
deprecation page exists.
- When cutting a mac release with a beta GitHub prerelease:
- tag `vYYYY.M.PATCH-beta.N` from the release commit
- create a prerelease titled `openclaw YYYY.M.PATCH-beta.N`
- tag `vYYYY.M.D-beta.N` from the release commit
- create a prerelease titled `openclaw YYYY.M.D-beta.N`
- use release notes from the stable base `CHANGELOG.md` version section
(`## YYYY.M.PATCH`), not a beta-specific heading
(`## YYYY.M.D`), not a beta-specific heading
- attach at least the zip and dSYM zip, plus dmg if available
- Keep the top version entries in `CHANGELOG.md` sorted by impact:
- `### Changes` first
@@ -336,10 +199,10 @@ Stable publication is not complete until `main` carries the actual shipped relea
Use the OpenClaw account's existing release-post style:
- Format: `OpenClaw YYYY.M.PATCH 🦞` or `🦞 OpenClaw YYYY.M.PATCH is live`, blank line,
- Format: `OpenClaw YYYY.M.D 🦞` or `🦞 OpenClaw YYYY.M.D is live`, blank line,
then 3-4 emoji-led bullets, blank line, one short punchline, then the release
link.
- For beta: say `OpenClaw YYYY.M.PATCH-beta.N 🦞` or `OpenClaw YYYY.M.PATCH beta N is
- For beta: say `OpenClaw YYYY.M.D-beta.N 🦞` or `OpenClaw YYYY.M.D beta N is
live`; keep it clearly beta and avoid implying stable promotion.
- Lead with user-visible capabilities, then important integrations, then
reliability/security/install fixes. Compress "lots of fixes" into one
@@ -424,7 +287,6 @@ Upgrade with the beta channel.
Before tagging or publishing, run:
```bash
pnpm release:fast-pretag-check
pnpm check:architecture
pnpm build
pnpm ui:build
@@ -433,38 +295,6 @@ pnpm release:check
pnpm test:install:smoke
```
- Treat `pnpm release:fast-pretag-check` as a hard packaging gate. Every
publishable plugin must have a non-empty package-root `README.md`, build its
package-local runtime, and pass the npm and ClawHub release metadata checks
before a tag or publish workflow can start. Do not defer README, entrypoint,
or packed-artifact failures to postpublish verification.
- Before tagging, require green CI for the exact release-candidate SHA, not an
earlier branch SHA. Heal every related red CI, release-check, packaging, or
root-Dockerfile lane on the release branch, forward-port the fix to `main`,
and rerun the affected exact-SHA gates. Never waive a red Docker lane because
npm preflight passed.
- Root Dockerfile proof is mandatory before every beta and stable tag. Run the
release `install-smoke` group or equivalent root Dockerfile build for the
exact candidate SHA and require it to pass. The tag-triggered Docker Release
workflow is post-tag publishing, not the first valid proof that the root
Dockerfile can build.
- Before tagging, diff publishable plugin package manifests against the last
reachable stable/beta release tag. For every newly publishable package
(`openclaw.release.publishToNpm: true` or `publishToClawHub: true`) whose
package name did not exist in the base tag, verify the target registry package
already exists in npm/ClawHub or stop and help the owner mint/prepublish the
package first. Do not hide or disable release surfaces just to unblock a
train unless the owner explicitly decides the plugin should not ship in that
release; first-package registry ownership is release prep, not product
rollback. The mint/prepublish path must either be the real release publish
path for the auto-bumped beta version, or a deliberately non-consuming
registry-prep step that cannot occupy the next beta version/tag. Confirm
registry owner, npm scope/package-creation permission, provenance path, and
first-package publish plan before the full release publish continues. Useful
npm probe:
`npm view <package-name> version dist-tags --json --prefer-online`; a 404 for
a package newly added to the release is a release-prep blocker, not something
to discover from the publish job.
- Use `pnpm qa:otel:smoke` when release validation needs telemetry coverage.
It starts a local OTLP/HTTP trace receiver, runs QA-lab's
`otel-trace-smoke`, and checks span names plus content/identifier redaction
@@ -483,8 +313,8 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
```
- This verifies the published registry install path in a fresh temp prefix.
- For stable correction releases like `YYYY.M.PATCH-N`, it also verifies the
upgrade path from `YYYY.M.PATCH` to `YYYY.M.PATCH-N` so a correction publish cannot
- For stable correction releases like `YYYY.M.D-N`, it also verifies the
upgrade path from `YYYY.M.D` to `YYYY.M.D-N` so a correction publish cannot
silently leave existing global installs on the old base stable payload.
- Treat install smoke as a pack-budget gate too. `pnpm test:install:smoke`
now fails the candidate update tarball when npm reports an oversized
@@ -631,7 +461,7 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
`npm login --auth-type=legacy`, then confirm `npm whoami` reports
`steipete`.
- Promote with a fresh OTP:
`npm dist-tag add openclaw@YYYY.M.PATCH latest --otp "$OTP"`.
`npm dist-tag add openclaw@YYYY.M.D latest --otp "$OTP"`.
- Verify with a cache-bypassed registry read, for example:
`npm view openclaw dist-tags --json --prefer-online --cache /tmp/openclaw-npm-cache-verify-$$`
and `npm view openclaw@latest version dist.tarball --json --prefer-online`.
@@ -655,19 +485,9 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
- `preflight_only=true` on the npm workflow is also the right way to validate an
existing tag after publish; it should keep running the build checks even when
the npm version is already published.
- npm registry metadata is eventually consistent immediately after trusted
publishing. Keep postpublish `npm view` checks on bounded `--prefer-online`
retries, and carry that verified tarball/integrity metadata into later proof
steps instead of reading the registry again. If the OpenClaw npm child
succeeded but the parent publish workflow failed on an immediate exact-version
`E404`, verify the exact version with a cache-bypassed registry read, run the
standalone postpublish verifier and the full beta verifier with the original
successful child run IDs, then finalize the draft, dependency evidence asset,
and release proof manually. Never rerun the publish workflow for that
already-published version.
- npm validation-only preflight may still be dispatched from ordinary branches
when testing workflow changes before merge. Release checks and real publish
use only `main` or `release/YYYY.M.PATCH`.
use only `main` or `release/YYYY.M.D`.
- `.github/workflows/macos-release.yml` in `openclaw/openclaw` is now a
public validation-only handoff. It validates the tag/release state and points
operators to the private repo. It still rebuilds the JS outputs needed for
@@ -692,7 +512,7 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
waives the full gate; mac beta validation is still only required when
requested.
- Real publish runs may be dispatched from `main` or from a
`release/YYYY.M.PATCH` branch. For release-branch runs, the tag must be contained
`release/YYYY.M.D` branch. For release-branch runs, the tag must be contained
in that release branch, and the real publish must reuse a successful preflight
from the same branch.
- The release workflows stay tag-based; rely on the documented release sequence
@@ -720,11 +540,7 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
- Use `NPM_TOKEN` only for explicit npm dist-tag management modes, because npm
does not support trusted publishing for `npm dist-tag add`.
- `@openclaw/*` plugin publishes use a separate maintainer-only flow.
- Publishable plugins that are new to npm require owner-led first-package
minting before the full release publish. Do not consume the next beta version
with an ad-hoc manual package publish; use the release-owned auto-bumped
version path, or a non-consuming registry setup/preflight step. Bundled
disk-tree-only plugins stay unpublished.
- Only publish plugins that already exist on npm; bundled disk-tree-only plugins stay unpublished.
## Fallback local mac publish
@@ -764,8 +580,8 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
4. Pull latest `main` and confirm current `main` CI is green.
5. Run `/changelog` for the stable base target version on `main`, commit the
changelog rewrite immediately, push, and pull/rebase. For beta releases,
keep the changelog heading as `## YYYY.M.PATCH`, not `## YYYY.M.PATCH-beta.N`.
6. Create `release/YYYY.M.PATCH` from that post-changelog `main` commit.
keep the changelog heading as `## YYYY.M.D`, not `## YYYY.M.D-beta.N`.
6. Create `release/YYYY.M.D` from that post-changelog `main` commit.
7. Make every repo version location match the beta tag before creating it.
8. Commit release preparation changes on the release branch and push the branch.
9. Immediately dispatch Actions > `OpenClaw Performance` from `main` with
@@ -773,18 +589,15 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
off, live OpenAI off, and regression failure off. Let it run in parallel
with preflight and validation work.
10. Run the fast local beta preflight from the release branch before any npm
preflight or publish. Require exact-SHA CI and root Dockerfile install-smoke
to be green before tagging. Keep the remaining expensive Docker, Parallels,
and published-package install/update lanes for after the beta is live unless
the operator asks to run them before beta publication.
preflight or publish. Keep expensive Docker, Parallels, and published-package
install/update lanes for after the beta is live unless the operator asks to
run them before beta publication.
11. For beta releases, skip mac app build/sign/notarize unless beta scope or a
release blocker specifically requires it. For stable releases, include the
mac app, signing, notarization, and appcast path.
12. Confirm the target npm version is not already published.
13. Create and push the git tag from the release branch.
14. Do not create or publish the matching GitHub release page yet. The real
publish workflow creates or undrafts it only after postpublish verification
and release evidence upload pass.
14. Create or refresh the matching GitHub release.
15. Dispatch Actions > `QA-Lab - All Lanes` against the release tag and wait
for the mock parity, live Matrix, and live Telegram credentialed-channel
lanes to pass.
@@ -807,39 +620,21 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
with `preflight_only=true` and wait for it to pass. Save that run id because
the real publish requires it to reuse the notarized mac artifacts.
21. If any preflight or validation run fails, fix the issue on a new commit,
delete the tag and any accidental draft/incomplete GitHub release, recreate
the tag from the fixed commit, and rerun all relevant preflights from
scratch before continuing. Never reuse old preflight results after the
commit changes. Once the npm version exists, do not rerun the publish
workflow for that same version; finalize the existing draft/evidence state
manually or cut a correction tag. For pushed or published beta tags, do not
delete/recreate; increment to the next beta tag. For preflight-only failures
where npm did not publish the beta version, delete/recreate the same beta
tag and any accidental draft/incomplete prerelease at the fixed commit
instead of skipping a prerelease number.
22. Start `.github/workflows/openclaw-release-publish.yml` from the same branch with
delete the tag and matching GitHub release, recreate them from the fixed
commit, and rerun all relevant preflights from scratch before continuing.
Never reuse old preflight results after the commit changes. For pushed or
published beta tags, do not delete/recreate; increment to the next beta tag.
For preflight-only failures where npm did not publish the beta version,
delete/recreate the same beta tag and prerelease at the fixed commit instead
of skipping a prerelease number.
22. Start `.github/workflows/openclaw-npm-release.yml` from the same branch with
the same tag for the real publish, choose `npm_dist_tag` (`beta` default,
`latest` only when you intentionally want direct stable publish), keep it
the same as the preflight run, and pass the successful npm
`preflight_run_id` plus the successful `full_release_validation_run_id`.
For stable publish, also pass the exact non-prerelease
`openclaw/openclaw-windows-node` tag as `windows_node_tag` and its
candidate-approved installer digest map as `windows_node_installer_digests`.
`preflight_run_id`.
23. Wait for `npm-release` approval from `@openclaw/openclaw-release-managers`.
24. Wait for the real publish workflow to run postpublish verification,
create or update the GitHub release as a draft, upload dependency evidence,
promote and verify the required Windows Hub assets for stable releases,
append release verification proof, and only then undraft/publish it. If a
waited plugin publish or Windows Hub promotion fails after OpenClaw npm
succeeds, the workflow keeps the release draft with OpenClaw npm evidence
and exits red; do not undraft until the gap is repaired. The standalone
verifier command remains the first recovery probe:
24. Run postpublish verification:
`node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>`.
For a failed postpublish parent after successful publish children, also run
`pnpm release:verify-beta -- <published-version> ... --skip-github-release`
with the original child run IDs and an evidence output path before manually
recreating the workflow's draft, dependency evidence asset, proof section,
and publish step.
25. Run the post-published beta verification roster. First scan current `main`
for critical fixes that landed after the release branch cut; backport only
important low-risk fixes before starting expensive lanes, or increment to
@@ -876,13 +671,13 @@ node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>
and `.dSYM.zip` artifacts to the existing GitHub release in
`openclaw/openclaw`.
32. For stable releases, download `macos-appcast-<tag>` from the successful
private mac run, update `appcast.xml` on `main`, verify the feed, then
complete the **Close stable releases on main** gate.
private mac run, update `appcast.xml` on `main`, and verify the feed. Merge
or cherry-pick release branch changes back to `main` after stable succeeds.
33. For beta releases, publish the mac assets only when intentionally requested;
expect no shared production
`appcast.xml` artifact and do not update the shared production feed unless a
separate beta feed exists.
34. After stable main closeout, verify npm and the attached release artifacts.
34. After publish, verify npm and the attached release artifacts.
## GHSA advisory work

View File

@@ -37,11 +37,9 @@ This is good for auditability if commits are clearly machine-authored and gated
- Branch name: `tideclaw/alpha/YYYY-MM-DD-HHMMZ`
- Base: current `origin/main` SHA at trigger time.
- State file: resolve from `$release-private` on the Tideclaw host.
- Release tag: `vYYYY.M.PATCH-alpha.N`
- Release tag: `vYYYY.M.D-alpha.N`
- npm dist-tag: `alpha`
`PATCH` is a sequential monthly release-train number, never the calendar day. Determine the alpha train from stable and beta releases; ignore alpha-only patch numbers when choosing the next train. Use one greater than the highest stable/beta patch for the month, then increment only `alpha.N` for repeated nightlies on that train. If a beta exists on that next patch, move alpha to the following train. Legacy alpha-only tags with inflated patch numbers do not advance beta/stable numbering.
Do not reuse old alpha branches for a new run. If rerunning the same base SHA, create a new timestamped branch and record why.
## Start
@@ -100,7 +98,7 @@ Tideclaw may run beta releases from `#releases` or mentioned `#maintainers` comm
Accepted shapes:
```text
@Tideclaw beta release from vYYYY.M.PATCH-alpha.N
@Tideclaw beta release from vYYYY.M.D-alpha.N
@Tideclaw beta release from tideclaw/alpha/YYYY-MM-DD-HHMMZ
@Tideclaw beta release from latest proven alpha
```
@@ -112,7 +110,7 @@ Rules:
3. Verify the source alpha first: GitHub release, npm `alpha` package, release CI, recorded state file, and branch/tag SHA.
4. Create a fresh beta branch `tideclaw/beta/YYYY-MM-DD-HHMMZ` from the proven alpha source, not directly from a moving `main`.
5. Reuse/squash only stabilization fixes already proven on alpha. Do not import unrelated alpha release mechanics unless the beta release docs require them.
6. Compute beta as `vYYYY.M.PATCH-beta.N`, matching npm `--tag beta`. Ignore alpha-only patch numbers when selecting the beta train.
6. Compute beta as `vYYYY.M.D-beta.N`, matching npm `--tag beta`.
7. Run beta release validation/preflight/full release CI and fix failures on the beta branch.
8. Publish beta only after green beta gates. Use GitHub Actions/OIDC, never direct npm publish from the host.
9. Final Discord summary must include source alpha, beta tag/version, branch, fix commits, workflow run IDs, npm/GitHub proof, and any skipped/blocked reason.
@@ -167,7 +165,7 @@ git push -u origin "$BRANCH"
After local proof:
1. Compute the next `vYYYY.M.PATCH-alpha.N` from existing git tags, npm versions, and GitHub releases. Select `PATCH` from stable/beta trains, not the date or the highest alpha-only patch. Reuse the same alpha train and increment `alpha.N` until that patch has a beta; after a beta exists, use the following patch for new alpha builds.
1. Compute the next `vYYYY.M.D-alpha.N` from existing git tags, npm versions, and GitHub releases.
2. Make the alpha branch package version and release metadata match that tag, commit it, and push the branch.
3. Run release validation from the alpha branch, using GitHub CLI, not browser/fetch tools. On the Tideclaw host, bare `gh` is a read-only Codex sandbox wrapper; use `/usr/local/bin/gh-tideclaw-write` for write-capable commands such as `workflow run`, `run cancel`, and publish dispatch:

View File

@@ -29,17 +29,11 @@ publish skill; use `$release-openclaw-maintainer` before changing release state.
- Confirm release body has npm, CI, plugin npm, ClawHub, mac/appcast evidence
links when expected.
- Confirm assets expected for stable mac releases are uploaded: zip, dmg,
dSYM, dependency evidence, immutable full-validation manifest,
postpublish evidence, and stable-main closeout manifest.
- Download each immutable evidence asset and its `.sha256` companion, then
verify the checksum before trusting the release record.
dSYM, dependency evidence when present.
2. Root npm:
- `npm view openclaw@<VERSION> version dist-tags.latest dist.tarball dist.integrity time.<VERSION> --json`
- `latest` must equal `<VERSION>` for stable.
- Record tarball, integrity, publish time.
- Confirm the release postpublish evidence records
`npmRegistrySignaturesVerified: true` and
`npmProvenanceAttestationMatched: true`.
3. Plugin publish set:
- Get exact tag metadata from GitHub, not the local checkout when dirty:
download `https://api.github.com/repos/openclaw/openclaw/tarball/v<VERSION>`
@@ -63,9 +57,6 @@ publish skill; use `$release-openclaw-maintainer` before changing release state.
Full Release Validation, OpenClaw Release Checks, OpenClaw NPM Release,
Plugin NPM Release, Plugin ClawHub Release, mac preflight/validation/publish
when stable mac assets are expected.
- For stable, verify `OpenClaw Stable Main Closeout` succeeded and its
manifest records the matching release tag, current rollback drill, stable
soak, and blocking performance evidence.
- Summarize only relevant successful/failed jobs; ignore routine skipped
optional lanes unless the release body promised them.
6. Published package smoke:

5
.github/CODEOWNERS vendored
View File

@@ -12,14 +12,9 @@
/.github/workflows/codeql-android-critical-security.yml @openclaw/openclaw-secops
/.github/workflows/codeql-critical-quality.yml @openclaw/openclaw-secops
/.github/workflows/dependency-guard.yml @openclaw/openclaw-secops
/.github/workflows/security-sensitive-guard.yml @openclaw/openclaw-secops
/test/scripts/dependency-guard-workflow.test.ts @openclaw/openclaw-secops
/test/scripts/dependency-guard-script.test.ts @openclaw/openclaw-secops
/test/scripts/security-sensitive-guard-workflow.test.ts @openclaw/openclaw-secops
/test/scripts/security-sensitive-guard-script.test.ts @openclaw/openclaw-secops
/scripts/github/dependency-guard.mjs @openclaw/openclaw-secops
/scripts/github/security-sensitive-guard.mjs @openclaw/openclaw-secops
/.gitignore @openclaw/openclaw-secops
/package-lock.json @openclaw/openclaw-secops
/npm-shrinkwrap.json @openclaw/openclaw-secops
/extensions/*/package-lock.json @openclaw/openclaw-secops

View File

@@ -113,7 +113,7 @@ runs:
- name: Download OpenClaw Docker E2E package
if: inputs.hydrate-artifacts == 'true' && steps.plan.outputs.needs_package == '1'
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
uses: actions/download-artifact@v8
with:
name: ${{ inputs.package-artifact-name }}
path: .artifacts/docker-e2e-package

View File

@@ -139,7 +139,7 @@ runs:
- name: Save pnpm store cache
if: ${{ inputs.install-deps == 'true' && inputs.use-actions-cache == 'true' && inputs.save-actions-cache == 'true' && runner.os != 'Windows' && steps.setup-pnpm.outputs.store-cache-hit != 'true' }}
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache/save@v5
with:
path: ${{ steps.setup-pnpm.outputs.store-path }}
key: ${{ steps.setup-pnpm.outputs.store-cache-primary-key }}

View File

@@ -92,7 +92,7 @@ runs:
- name: Restore pnpm store cache
id: pnpm-store-cache
if: ${{ inputs.use-actions-cache == 'true' && runner.os != 'Windows' }}
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache/restore@v5
with:
path: ${{ steps.pnpm-store.outputs.path }}
key: pnpm-store-${{ runner.os }}-${{ runner.arch }}-${{ inputs.node-version }}-${{ hashFiles(inputs.package-manager-file) }}-${{ hashFiles(inputs.lockfile-path) }}

View File

@@ -20,7 +20,7 @@ paths:
- src/agents/tools/web-shared.ts
- src/plugin-sdk/ssrf-policy.ts
- src/web-fetch
- packages/web-content-core/src/provider-runtime-shared.ts
- src/web/provider-runtime-shared.ts
- packages/memory-host-sdk/src/host/ssrf-policy.ts
- packages/net-policy/src

View File

@@ -16,7 +16,7 @@ query-filters:
paths:
- src/web-fetch
- src/web-search
- packages/web-content-core/src/provider-runtime-shared.ts
- src/web/provider-runtime-shared.ts
- src/media
- src/media-understanding
- src/image-generation

8
.github/labeler.yml vendored
View File

@@ -293,10 +293,6 @@
- changed-files:
- any-glob-to-any-file:
- "extensions/lobster/**"
"extensions: llama-cpp":
- changed-files:
- any-glob-to-any-file:
- "extensions/llama-cpp/**"
"extensions: memory-core":
- changed-files:
- any-glob-to-any-file:
@@ -578,10 +574,6 @@
- changed-files:
- any-glob-to-any-file:
- "extensions/openshell/**"
"extensions: parallel":
- changed-files:
- any-glob-to-any-file:
- "extensions/parallel/**"
"extensions: perplexity":
- changed-files:
- any-glob-to-any-file:

View File

@@ -2,14 +2,19 @@
What problem does this PR solve?
Why does this matter now?
What is the intended outcome?
What is intentionally out of scope?
What does success look like?
What should reviewers focus on?
<details>
@@ -70,10 +75,13 @@ Be mindful of private information like IP addresses, API keys, phone numbers, no
Which commands did you run?
What regression coverage was added or updated?
What failed before this fix, if known?
If no test was added, why not?
<details>
@@ -87,12 +95,16 @@ List focused commands, not every incidental check. CI is useful support, but ext
Did user-visible behavior change? (`Yes/No`)
Did config, environment, or migration behavior change? (`Yes/No`)
Did security, auth, secrets, network, or tool execution behavior change? (`Yes/No`)
What is the highest-risk area?
How is that risk mitigated?
<details>
@@ -106,8 +118,10 @@ Use this for author judgment that is not obvious from the diff. ClawSweeper can
What is the next action?
What is still waiting on author, maintainer, CI, or external proof?
Which bot or reviewer comments were addressed?
<details>

View File

@@ -25,24 +25,24 @@ jobs:
pull-requests: write
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
- uses: actions/checkout@v6
with:
ref: ${{ github.sha }}
persist-credentials: false
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3
- uses: actions/create-github-app-token@v3
id: app-token
continue-on-error: true
with:
app-id: "2729701"
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3
- uses: actions/create-github-app-token@v3
id: app-token-fallback
if: steps.app-token.outcome == 'failure'
with:
app-id: "2971289"
private-key: ${{ secrets.GH_APP_PRIVATE_KEY_FALLBACK }}
- name: Run Barnacle auto-response
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9
uses: actions/github-script@v9
with:
github-token: ${{ steps.app-token.outputs.token || steps.app-token-fallback.outputs.token }}
script: |

View File

@@ -61,7 +61,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
-c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
@@ -140,7 +140,7 @@ jobs:
- name: Restore dist build cache
id: dist-cache
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache/restore@v5
with:
path: |
.artifacts/build-all-cache/
@@ -175,7 +175,7 @@ jobs:
- name: Save dist build cache
if: steps.dist-cache.outputs.cache-hit != 'true'
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache/save@v5
with:
path: |
.artifacts/build-all-cache/
@@ -188,7 +188,7 @@ jobs:
run: |
set -euo pipefail
timeout --signal=TERM --kill-after=10s 120s git \
timeout --signal=TERM --kill-after=10s 30s git \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=50 origin \
"+refs/heads/main:refs/remotes/origin/main"

View File

@@ -1,156 +0,0 @@
name: Blacksmith ARM Testbox
on:
workflow_dispatch:
inputs:
testbox_id:
type: string
description: "Testbox session ID"
required: true
pull_request:
paths:
- ".github/workflows/**"
permissions:
contents: read
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
PNPM_CONFIG_STORE_DIR: "/tmp/openclaw-pnpm-store"
PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN: "false"
jobs:
check-arm:
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
permissions:
contents: read
name: "check-arm"
runs-on: blacksmith-16vcpu-ubuntu-2404-arm
timeout-minutes: 120
steps:
- name: Begin Testbox
uses: useblacksmith/begin-testbox@d0e04585c26905fdd92c94a09c159544c7ee1b67
with:
testbox_id: ${{ inputs.testbox_id }}
- name: Verify ARM runner
shell: bash
run: |
set -euo pipefail
runner_arch="$(uname -m)"
echo "check-arm runner architecture: ${runner_arch}"
case "$runner_arch" in
aarch64 | arm64)
;;
*)
echo "check-arm requires an ARM64 runner; got ${runner_arch}" >&2
exit 1
;;
esac
- name: Checkout
shell: bash
env:
CHECKOUT_REPO: ${{ github.repository }}
CHECKOUT_SHA: ${{ github.sha }}
CHECKOUT_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
workdir="$GITHUB_WORKSPACE"
if [[ -z "$CHECKOUT_TOKEN" ]]; then
echo "checkout token is missing" >&2
exit 1
fi
auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')"
reset_checkout_dir() {
mkdir -p "$workdir"
find "$workdir" -mindepth 1 -maxdepth 1 -exec rm -rf {} +
}
checkout_attempt() {
local attempt="$1"
reset_checkout_dir
git init "$workdir" >/dev/null
git config --global --add safe.directory "$workdir"
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
-c protocol.version=2 \
-c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
git -C "$workdir" checkout --force --detach "$CHECKOUT_SHA" || return 1
test -f "$workdir/.github/actions/setup-node-env/action.yml" || return 1
echo "checkout attempt ${attempt}/5 succeeded"
}
for attempt in 1 2 3 4 5; do
if checkout_attempt "$attempt"; then
exit 0
fi
echo "checkout attempt ${attempt}/5 failed"
sleep $((attempt * 5))
done
echo "checkout failed after 5 attempts" >&2
exit 1
- name: Setup Node environment
uses: ./.github/actions/setup-node-env
with:
install-bun: "false"
- name: Prepare Testbox shell
shell: bash
run: |
set -euo pipefail
timeout --signal=TERM --kill-after=10s 120s git \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=50 origin \
"+refs/heads/main:refs/remotes/origin/main"
node_bin="$(dirname "$(node -p 'process.execPath')")"
sudo ln -sf "$node_bin/node" /usr/local/bin/node
sudo ln -sf "$node_bin/npm" /usr/local/bin/npm
sudo ln -sf "$node_bin/npx" /usr/local/bin/npx
sudo ln -sf "$node_bin/corepack" /usr/local/bin/corepack
sudo tee /usr/local/bin/pnpm >/dev/null <<'PNPM'
#!/usr/bin/env bash
exec /usr/local/bin/corepack pnpm "$@"
PNPM
sudo chmod 0755 /usr/local/bin/pnpm
- name: Hydrate Testbox provider env helper
shell: bash
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
ANTHROPIC_API_KEY_OLD: ${{ secrets.ANTHROPIC_API_KEY_OLD }}
ANTHROPIC_API_TOKEN: ${{ secrets.ANTHROPIC_API_TOKEN }}
CEREBRAS_API_KEY: ${{ secrets.CEREBRAS_API_KEY }}
DEEPINFRA_API_KEY: ${{ secrets.DEEPINFRA_API_KEY }}
FACTORY_API_KEY: ${{ secrets.FACTORY_API_KEY }}
FIREWORKS_API_KEY: ${{ secrets.FIREWORKS_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
KIMI_API_KEY: ${{ secrets.KIMI_API_KEY }}
MINIMAX_API_KEY: ${{ secrets.MINIMAX_API_KEY }}
MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }}
MOONSHOT_API_KEY: ${{ secrets.MOONSHOT_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
QWEN_API_KEY: ${{ secrets.QWEN_API_KEY }}
TOGETHER_API_KEY: ${{ secrets.TOGETHER_API_KEY }}
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
ZAI_API_KEY: ${{ secrets.ZAI_API_KEY }}
Z_AI_API_KEY: ${{ secrets.Z_AI_API_KEY }}
run: bash scripts/ci-hydrate-testbox-env.sh
- name: Run Testbox
uses: useblacksmith/run-testbox@5ca05834db1d3813554d1dd109e5f2087a8d7cbc
if: success()
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

View File

@@ -6,10 +6,6 @@ on:
type: string
description: "Testbox session ID"
required: true
timeout_minutes:
type: number
description: "Maximum GitHub job runtime for long Testbox commands"
default: 120
pull_request:
paths:
- ".github/workflows/**"
@@ -29,7 +25,7 @@ jobs:
contents: read
name: "check"
runs-on: blacksmith-32vcpu-ubuntu-2404
timeout-minutes: ${{ fromJSON(inputs.timeout_minutes || '30') }}
timeout-minutes: 30
steps:
- name: Begin Testbox
uses: useblacksmith/begin-testbox@233448af4bfdc6fca509a7f0974411ac6d8a8043
@@ -65,7 +61,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
-c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
@@ -95,7 +91,7 @@ jobs:
run: |
set -euo pipefail
timeout --signal=TERM --kill-after=10s 120s git \
timeout --signal=TERM --kill-after=10s 30s git \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=50 origin \
"+refs/heads/main:refs/remotes/origin/main"
@@ -143,3 +139,139 @@ jobs:
if: success()
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
check-arm:
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
permissions:
contents: read
name: "check-arm"
runs-on: blacksmith-16vcpu-ubuntu-2404-arm
timeout-minutes: 120
steps:
- name: Begin Testbox
uses: useblacksmith/begin-testbox@d0e04585c26905fdd92c94a09c159544c7ee1b67
with:
testbox_id: ${{ inputs.testbox_id }}
- name: Verify ARM runner
shell: bash
run: |
set -euo pipefail
runner_arch="$(uname -m)"
echo "check-arm runner architecture: ${runner_arch}"
case "$runner_arch" in
aarch64 | arm64)
;;
*)
echo "check-arm requires an ARM64 runner; got ${runner_arch}" >&2
exit 1
;;
esac
- name: Checkout
shell: bash
env:
CHECKOUT_REPO: ${{ github.repository }}
CHECKOUT_SHA: ${{ github.sha }}
CHECKOUT_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
workdir="$GITHUB_WORKSPACE"
if [[ -z "$CHECKOUT_TOKEN" ]]; then
echo "checkout token is missing" >&2
exit 1
fi
auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')"
reset_checkout_dir() {
mkdir -p "$workdir"
find "$workdir" -mindepth 1 -maxdepth 1 -exec rm -rf {} +
}
checkout_attempt() {
local attempt="$1"
reset_checkout_dir
git init "$workdir" >/dev/null
git config --global --add safe.directory "$workdir"
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
-c "http.extraheader=AUTHORIZATION: basic ${auth_header}" \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
git -C "$workdir" checkout --force --detach "$CHECKOUT_SHA" || return 1
test -f "$workdir/.github/actions/setup-node-env/action.yml" || return 1
echo "checkout attempt ${attempt}/5 succeeded"
}
for attempt in 1 2 3 4 5; do
if checkout_attempt "$attempt"; then
exit 0
fi
echo "checkout attempt ${attempt}/5 failed"
sleep $((attempt * 5))
done
echo "checkout failed after 5 attempts" >&2
exit 1
- name: Setup Node environment
uses: ./.github/actions/setup-node-env
with:
install-bun: "false"
- name: Prepare Testbox shell
shell: bash
run: |
set -euo pipefail
timeout --signal=TERM --kill-after=10s 30s git \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=50 origin \
"+refs/heads/main:refs/remotes/origin/main"
node_bin="$(dirname "$(node -p 'process.execPath')")"
sudo ln -sf "$node_bin/node" /usr/local/bin/node
sudo ln -sf "$node_bin/npm" /usr/local/bin/npm
sudo ln -sf "$node_bin/npx" /usr/local/bin/npx
sudo ln -sf "$node_bin/corepack" /usr/local/bin/corepack
sudo tee /usr/local/bin/pnpm >/dev/null <<'PNPM'
#!/usr/bin/env bash
exec /usr/local/bin/corepack pnpm "$@"
PNPM
sudo chmod 0755 /usr/local/bin/pnpm
- name: Hydrate Testbox provider env helper
shell: bash
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
ANTHROPIC_API_KEY_OLD: ${{ secrets.ANTHROPIC_API_KEY_OLD }}
ANTHROPIC_API_TOKEN: ${{ secrets.ANTHROPIC_API_TOKEN }}
CEREBRAS_API_KEY: ${{ secrets.CEREBRAS_API_KEY }}
DEEPINFRA_API_KEY: ${{ secrets.DEEPINFRA_API_KEY }}
FACTORY_API_KEY: ${{ secrets.FACTORY_API_KEY }}
FIREWORKS_API_KEY: ${{ secrets.FIREWORKS_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
KIMI_API_KEY: ${{ secrets.KIMI_API_KEY }}
MINIMAX_API_KEY: ${{ secrets.MINIMAX_API_KEY }}
MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }}
MOONSHOT_API_KEY: ${{ secrets.MOONSHOT_API_KEY }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
OPENAI_BASE_URL: ${{ secrets.OPENAI_BASE_URL }}
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
QWEN_API_KEY: ${{ secrets.QWEN_API_KEY }}
TOGETHER_API_KEY: ${{ secrets.TOGETHER_API_KEY }}
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
ZAI_API_KEY: ${{ secrets.ZAI_API_KEY }}
Z_AI_API_KEY: ${{ secrets.Z_AI_API_KEY }}
run: bash scripts/ci-hydrate-testbox-env.sh
- name: Run Testbox
uses: useblacksmith/run-testbox@5ca05834db1d3813554d1dd109e5f2087a8d7cbc
if: success()
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"

View File

@@ -13,11 +13,6 @@ on:
required: false
default: false
type: boolean
release_gate:
description: Run an exact-SHA maintainer release-gate fallback when PR CI is capacity-stalled.
required: false
default: false
type: boolean
push:
branches: [main]
paths-ignore:
@@ -31,8 +26,6 @@ on:
permissions:
contents: read
run-name: ${{ github.event_name == 'workflow_dispatch' && inputs.release_gate && format('CI release gate {0}', inputs.target_ref) || 'CI' }}
concurrency:
group: ${{ github.event_name == 'workflow_dispatch' && format('{0}-manual-v1-{1}', github.workflow, github.run_id) || (github.event_name == 'pull_request' && format('{0}-v7-{1}', github.workflow, github.event.pull_request.number) || (github.repository == 'openclaw/openclaw' && format('{0}-v7-{1}', github.workflow, github.ref) || format('{0}-v7-{1}-{2}', github.workflow, github.ref, github.sha))) }}
cancel-in-progress: ${{ github.event_name == 'pull_request' || (github.event_name == 'push' && github.repository == 'openclaw/openclaw' && github.ref == 'refs/heads/main') }}
@@ -82,23 +75,6 @@ jobs:
run_android_job: ${{ steps.manifest.outputs.run_android_job }}
android_matrix: ${{ steps.manifest.outputs.android_matrix }}
steps:
- name: Validate release-gate dispatch
if: github.event_name == 'workflow_dispatch' && inputs.release_gate
env:
TARGET_REF: ${{ inputs.target_ref }}
run: |
set -euo pipefail
if [[ ! "$TARGET_REF" =~ ^[0-9a-f]{40}$ ]]; then
echo "release_gate requires target_ref to be a full commit SHA" >&2
exit 1
fi
if [[ "$GITHUB_SHA" != "$TARGET_REF" ]]; then
echo "release_gate must run from the branch at target_ref" >&2
exit 1
fi
- name: Checkout
env:
CHECKOUT_REPO: ${{ github.repository }}
@@ -114,9 +90,9 @@ jobs:
local ref="$1"
local fetch_status
for attempt in 1 2 3; do
timeout --signal=TERM --kill-after=10s 120s git -C "$GITHUB_WORKSPACE" \
timeout --signal=TERM --kill-after=10s 30s git -C "$GITHUB_WORKSPACE" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=2 origin \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${ref}:refs/remotes/origin/checkout" && return 0
fetch_status="$?"
if [ "$fetch_status" != "124" ] && [ "$fetch_status" != "137" ]; then
@@ -170,12 +146,12 @@ jobs:
if [ "${{ github.event_name }}" = "push" ]; then
BASE="${{ github.event.before }}"
node scripts/ci-changed-scope.mjs --base "$BASE" --head HEAD
else
BASE="${{ github.event.pull_request.base.sha }}"
node scripts/ci-changed-scope.mjs --base "$BASE" --head HEAD --merge-head-first-parent
fi
node scripts/ci-changed-scope.mjs --base "$BASE" --head HEAD
- name: Build CI manifest
id: manifest
env:
@@ -183,7 +159,7 @@ jobs:
OPENCLAW_CI_DOCS_CHANGED: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.docs_scope.outputs.docs_changed }}
OPENCLAW_CI_RUN_NODE: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.changed_scope.outputs.run_node || 'false' }}
OPENCLAW_CI_RUN_MACOS: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.changed_scope.outputs.run_macos || 'false' }}
OPENCLAW_CI_RUN_ANDROID: ${{ github.event_name == 'workflow_dispatch' && (inputs.release_gate || inputs.include_android) && 'true' || steps.changed_scope.outputs.run_android || 'false' }}
OPENCLAW_CI_RUN_ANDROID: ${{ github.event_name == 'workflow_dispatch' && inputs.include_android && 'true' || steps.changed_scope.outputs.run_android || 'false' }}
OPENCLAW_CI_RUN_WINDOWS: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.changed_scope.outputs.run_windows || 'false' }}
OPENCLAW_CI_RUN_NODE_FAST_ONLY: ${{ github.event_name == 'workflow_dispatch' && 'false' || steps.changed_scope.outputs.run_node_fast_only || 'false' }}
OPENCLAW_CI_RUN_NODE_FAST_PLUGIN_CONTRACTS: ${{ github.event_name == 'workflow_dispatch' && 'false' || steps.changed_scope.outputs.run_node_fast_plugin_contracts || 'false' }}
@@ -375,7 +351,7 @@ jobs:
local ref="$1"
local fetch_status
for attempt in 1 2 3; do
timeout --signal=TERM --kill-after=10s 120s git -C "$GITHUB_WORKSPACE" \
timeout --signal=TERM --kill-after=10s 30s git -C "$GITHUB_WORKSPACE" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${ref}:refs/remotes/origin/checkout" && return 0
@@ -523,7 +499,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -588,7 +564,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -622,7 +598,7 @@ jobs:
install-bun: "false"
- name: Restore build-all step cache
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache@v5
with:
path: .artifacts/build-all-cache
key: ${{ runner.os }}-build-all-v3-${{ hashFiles('package.json', 'pnpm-lock.yaml', 'npm-shrinkwrap.json', 'packages/plugin-sdk/package.json', 'packages/llm-core/package.json', 'packages/model-catalog-core/package.json', 'packages/memory-host-sdk/package.json', 'scripts/build-all.mjs', 'scripts/write-plugin-sdk-entry-dts.ts', 'scripts/lib/plugin-sdk-entries.mjs', 'tsconfig.json', 'tsconfig.plugin-sdk.dts.json', 'src/plugin-sdk/**', 'packages/llm-core/src/**', 'packages/model-catalog-core/src/**', 'packages/memory-host-sdk/src/**', 'src/types/**', 'src/video-generation/dashscope-compatible.ts', 'src/video-generation/types.ts', 'scripts/copy-export-html-templates.ts', 'scripts/lib/copy-assets.ts', 'src/auto-reply/reply/export-html/**') }}
@@ -631,7 +607,7 @@ jobs:
- name: Restore dist build cache
id: dist_build_cache
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache/restore@v5
with:
path: |
dist/
@@ -654,14 +630,14 @@ jobs:
run: tar --posix -cf dist-runtime-build.tar.zst --use-compress-program zstdmt dist dist-runtime
- name: Upload built runtime artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v7
with:
name: dist-runtime-build
path: dist-runtime-build.tar.zst
retention-days: 1
- name: Upload bundled plugin asset artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v7
with:
name: bundled-plugin-assets
path: |
@@ -692,7 +668,7 @@ jobs:
- name: Upload startup memory report
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v7
with:
name: startup-memory
path: .artifacts/startup-memory/
@@ -744,6 +720,11 @@ jobs:
node scripts/run-vitest.mjs run --config test/vitest/vitest.full-core-support-boundary.config.ts
fi
if [ "$RUN_GATEWAY_WATCH" = "true" ]; then
start_check "gateway-watch" \
node scripts/check-gateway-watch-regression.mjs --skip-build --ready-timeout-ms 5000
fi
for index in "${!pids[@]}"; do
name="${names[$index]}"
log="${logs[$index]}"
@@ -761,21 +742,6 @@ jobs:
results["$name"]="$result"
done
if [ "$RUN_GATEWAY_WATCH" = "true" ]; then
log="${RUNNER_TEMP}/gateway-watch.log"
echo "starting gateway-watch: node scripts/check-gateway-watch-regression.mjs --skip-build"
if node scripts/check-gateway-watch-regression.mjs --skip-build >"$log" 2>&1; then
result="success"
else
result="failure"
fi
echo "::group::gateway-watch log"
cat "$log"
echo "::endgroup::"
results["gateway-watch"]="$result"
fi
for name in channels core-support-boundary gateway-watch; do
echo "${name}-result=${results[$name]}" >> "$GITHUB_OUTPUT"
done
@@ -791,7 +757,7 @@ jobs:
- name: Save dist build cache
if: steps.dist_build_cache.outputs.cache-hit != 'true'
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache/save@v5
continue-on-error: true
with:
path: |
@@ -803,7 +769,7 @@ jobs:
- name: Upload gateway watch regression artifacts
if: always() && needs.preflight.outputs.run_check_additional == 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v7
with:
name: gateway-watch-regression
path: .local/gateway-watch-regression/
@@ -844,7 +810,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -884,10 +850,10 @@ jobs:
;;
contracts-plugins-ci-routing)
pnpm test:contracts:plugins
pnpm test src/commands/status.scan-result.test.ts src/scripts/ci-changed-scope.test.ts test/scripts/changed-lanes.test.ts test/scripts/ci-workflow-guards.test.ts test/scripts/run-vitest.test.ts test/scripts/test-projects.test.ts
pnpm test src/commands/status.scan-result.test.ts src/scripts/ci-changed-scope.test.ts test/scripts/changed-lanes.test.ts test/scripts/run-vitest.test.ts test/scripts/test-projects.test.ts
;;
ci-routing)
pnpm test src/commands/status.scan-result.test.ts src/scripts/ci-changed-scope.test.ts test/scripts/changed-lanes.test.ts test/scripts/ci-workflow-guards.test.ts test/scripts/run-vitest.test.ts test/scripts/test-projects.test.ts
pnpm test src/commands/status.scan-result.test.ts src/scripts/ci-changed-scope.test.ts test/scripts/changed-lanes.test.ts test/scripts/run-vitest.test.ts test/scripts/test-projects.test.ts
;;
bun-launcher)
OPENCLAW_TEST_BUN_LAUNCHER=1 pnpm test test/openclaw-launcher.e2e.test.ts
@@ -933,7 +899,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -1013,7 +979,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -1090,7 +1056,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -1165,7 +1131,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -1292,7 +1258,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -1322,7 +1288,6 @@ jobs:
env:
OPENCLAW_LOCAL_CHECK: "0"
TASK: ${{ matrix.task }}
PR_BASE_SHA: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || '' }}
shell: bash
run: |
set -euo pipefail
@@ -1332,10 +1297,6 @@ jobs:
pnpm tool-display:check
pnpm check:host-env-policy:swift
pnpm dup:check:coverage
if [ -n "$PR_BASE_SHA" ]; then
git fetch --no-tags --depth=1 origin "+${PR_BASE_SHA}:refs/remotes/origin/pr-base"
node scripts/report-test-temp-creations.mjs --base refs/remotes/origin/pr-base --head HEAD --no-merge-base
fi
pnpm deps:patches:check
pnpm lint:webhook:no-low-level-body-read
pnpm lint:auth:no-pairing-store-group
@@ -1373,7 +1334,7 @@ jobs:
- name: Upload deadcode reports
if: ${{ always() && matrix.task == 'dependencies' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v7
with:
name: deadcode-reports
path: .artifacts/deadcode
@@ -1397,10 +1358,6 @@ jobs:
- check_name: check-additional-boundaries-bcd
group: boundaries
boundary_shard: 2/4,3/4,4/4
- check_name: check-session-accessor-boundary
group: session-accessor-boundary
- check_name: check-session-transcript-reader-boundary
group: session-transcript-reader-boundary
- check_name: check-additional-extension-channels
group: extension-channels
- check_name: check-additional-extension-bundled
@@ -1433,7 +1390,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -1462,7 +1419,7 @@ jobs:
- name: Cache extension package boundary artifacts
id: extension-package-boundary-cache
if: matrix.group == 'extension-package-boundary'
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache@v5
with:
path: |
dist/plugin-sdk
@@ -1547,24 +1504,6 @@ jobs:
boundaries)
node scripts/run-additional-boundary-checks.mjs
;;
session-accessor-boundary)
if [ ! -f scripts/check-session-accessor-boundary.mjs ]; then
echo "[skip] session accessor boundary check is not present in this checkout"
elif ! node -e 'const pkg = require("./package.json"); process.exit(pkg.scripts?.["lint:tmp:session-accessor-boundary"] ? 0 : 1);'; then
echo "[skip] session accessor boundary script is not present in package.json"
else
run_check "lint:tmp:session-accessor-boundary" pnpm run lint:tmp:session-accessor-boundary
fi
;;
session-transcript-reader-boundary)
if [ ! -f scripts/check-session-transcript-reader-boundary.mjs ]; then
echo "[skip] session transcript reader boundary check is not present in this checkout"
elif ! node -e 'const pkg = require("./package.json"); process.exit(pkg.scripts?.["lint:tmp:session-transcript-reader-boundary"] ? 0 : 1);'; then
echo "[skip] session transcript reader boundary script is not present in package.json"
else
run_check "lint:tmp:session-transcript-reader-boundary" pnpm run lint:tmp:session-transcript-reader-boundary
fi
;;
extension-channels)
run_check "lint:extensions:channels" pnpm run lint:extensions:channels
;;
@@ -1618,7 +1557,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -1664,7 +1603,7 @@ jobs:
git -C "$workdir" config gc.auto 0
git -C "$workdir" remote add origin "https://github.com/openclaw/clawhub.git"
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+refs/heads/main:refs/remotes/origin/checkout" || return 1
@@ -1711,7 +1650,7 @@ jobs:
fetch_checkout_ref() {
local fetch_status
for attempt in 1 2 3; do
timeout --signal=TERM --kill-after=10s 120s git -C "$GITHUB_WORKSPACE" \
timeout --signal=TERM --kill-after=10s 30s git -C "$GITHUB_WORKSPACE" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/checkout" && return 0
@@ -1730,7 +1669,7 @@ jobs:
git -C "$GITHUB_WORKSPACE" checkout --detach refs/remotes/origin/checkout
- name: Setup Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
uses: actions/setup-python@v6
with:
python-version: "3.12"
@@ -1999,7 +1938,7 @@ jobs:
echo "key=$toolchain_key" >> "$GITHUB_OUTPUT"
- name: Cache SwiftPM
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache@v5
with:
path: ~/Library/Caches/org.swift.swiftpm
key: ${{ runner.os }}-swiftpm-${{ hashFiles('apps/macos/Package.resolved') }}
@@ -2008,7 +1947,7 @@ jobs:
- name: Cache Swift build directory
id: swift-build-cache
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache@v5
with:
path: apps/macos/.build
key: ${{ runner.os }}-swift-build-v2-${{ steps.swift-toolchain.outputs.key }}-${{ hashFiles('apps/macos/Package.swift', 'apps/macos/Package.resolved', 'apps/macos/Sources/**', 'apps/macos/Tests/**', 'apps/shared/OpenClawKit/Package.swift', 'apps/shared/OpenClawKit/Sources/**', 'apps/swabble/Package.swift', 'apps/swabble/Sources/**') }}
@@ -2117,7 +2056,7 @@ jobs:
git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}.git"
git -C "$workdir" config gc.auto 0
timeout --signal=TERM --kill-after=10s 120s git -C "$workdir" \
timeout --signal=TERM --kill-after=10s 30s git -C "$workdir" \
-c protocol.version=2 \
fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \
"+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" || return 1
@@ -2139,7 +2078,7 @@ jobs:
exit 1
- name: Setup Java
uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5
uses: actions/setup-java@v5
with:
distribution: temurin
# Keep sdkmanager on the stable JDK path for Linux CI runners.
@@ -2151,10 +2090,10 @@ jobs:
apps/android/gradle/libs.versions.toml
- name: Cache Android SDK
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
uses: actions/cache@v5
with:
path: ~/.android-sdk
key: ${{ runner.os }}-android-sdk-v1-cmdline-14742923-platform-37.0-build-tools-36.0.0
key: ${{ runner.os }}-android-sdk-v1-cmdline-12266719-platform-36-build-tools-36.0.0
restore-keys: |
${{ runner.os }}-android-sdk-v1-
@@ -2162,7 +2101,7 @@ jobs:
run: |
set -euo pipefail
ANDROID_SDK_ROOT="$HOME/.android-sdk"
CMDLINE_TOOLS_VERSION="14742923"
CMDLINE_TOOLS_VERSION="12266719"
ARCHIVE="commandlinetools-linux-${CMDLINE_TOOLS_VERSION}_latest.zip"
URL="https://dl.google.com/android/repository/${ARCHIVE}"
@@ -2184,7 +2123,7 @@ jobs:
yes | sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" --licenses >/dev/null
sdkmanager --sdk_root="${ANDROID_SDK_ROOT}" --install \
"platform-tools" \
"platforms;android-37.0" \
"platforms;android-36" \
"build-tools;36.0.0"
- name: Run Android ${{ matrix.task }}
@@ -2238,7 +2177,7 @@ jobs:
timeout-minutes: 5
steps:
- name: Checkout timing summary helper
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || needs.preflight.outputs.checkout_revision || github.sha }}
fetch-depth: 1
@@ -2254,7 +2193,7 @@ jobs:
cat ci-timings-summary.txt >> "$GITHUB_STEP_SUMMARY"
- name: Upload CI timing summary
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v7
with:
name: ci-timings-summary
path: ci-timings-summary.txt

View File

@@ -35,7 +35,7 @@ jobs:
java-version: "21"
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: java-kotlin
build-mode: manual
@@ -46,6 +46,6 @@ jobs:
run: ./gradlew --no-daemon :app:assemblePlayDebug
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-security/android"

View File

@@ -342,13 +342,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-core-auth-secrets-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/core-auth-secrets"
@@ -365,13 +365,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-config-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/config-boundary"
@@ -388,13 +388,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-gateway-runtime-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/gateway-runtime-boundary"
@@ -411,13 +411,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-channel-runtime-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/channel-runtime-boundary"
@@ -460,7 +460,7 @@ jobs:
- name: Initialize CodeQL
if: ${{ github.event_name != 'pull_request' }}
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-network-runtime-boundary-critical-quality.yml
@@ -468,7 +468,7 @@ jobs:
- name: Analyze
id: analyze
if: ${{ github.event_name != 'pull_request' }}
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
output: sarif-results
category: "/codeql-critical-quality/network-runtime-boundary"
@@ -518,13 +518,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-agent-runtime-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/agent-runtime-boundary"
@@ -541,13 +541,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-mcp-process-runtime-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/mcp-process-runtime-boundary"
@@ -564,13 +564,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-memory-runtime-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/memory-runtime-boundary"
@@ -587,13 +587,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-session-diagnostics-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/session-diagnostics-boundary"
@@ -610,13 +610,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-plugin-sdk-reply-runtime-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/plugin-sdk-reply-runtime"
@@ -633,13 +633,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-provider-runtime-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/provider-runtime-boundary"
@@ -655,13 +655,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-ui-control-plane-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/ui-control-plane"
@@ -677,13 +677,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-web-media-runtime-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/web-media-runtime-boundary"
@@ -700,13 +700,13 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-plugin-boundary-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/plugin-boundary"
@@ -723,12 +723,12 @@ jobs:
submodules: false
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: javascript-typescript
config-file: ./.github/codeql/codeql-plugin-sdk-package-contract-critical-quality.yml
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-critical-quality/plugin-sdk-package-contract"

View File

@@ -35,7 +35,7 @@ jobs:
swift --version
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: swift
build-mode: manual
@@ -46,7 +46,7 @@ jobs:
- name: Analyze
id: analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
output: sarif-results
upload: failure-only
@@ -83,7 +83,7 @@ jobs:
done
- name: Upload filtered SARIF
uses: github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/upload-sarif@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
sarif_file: sarif-results-filtered
category: "/codeql-critical-security/macos"

View File

@@ -101,12 +101,12 @@ jobs:
.github/codeql
- name: Initialize CodeQL
uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
languages: ${{ matrix.language }}
config-file: ${{ matrix.config_file }}
- name: Analyze
uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4
with:
category: "/codeql-security-high/${{ matrix.category }}"

View File

@@ -35,7 +35,7 @@ jobs:
locales_json: ${{ steps.plan.outputs.locales_json }}
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
fetch-depth: 0
persist-credentials: false
@@ -112,7 +112,7 @@ jobs:
name: Refresh ${{ matrix.locale }}
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
persist-credentials: true
submodules: false

View File

@@ -32,11 +32,11 @@ permissions:
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
PNPM_CONFIG_CHILD_CONCURRENCY: "1"
PNPM_CONFIG_MODULES_DIR: "/var/tmp/openclaw-pnpm/node_modules"
PNPM_CONFIG_MODULES_DIR: "/tmp/openclaw-pnpm-node-modules"
PNPM_CONFIG_NETWORK_CONCURRENCY: "1"
PNPM_CONFIG_STORE_DIR: "/var/cache/crabbox/pnpm/store"
PNPM_CONFIG_STORE_DIR: "/tmp/openclaw-pnpm-store"
PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN: "false"
PNPM_CONFIG_VIRTUAL_STORE_DIR: "/var/tmp/openclaw-pnpm/virtual-store"
PNPM_CONFIG_VIRTUAL_STORE_DIR: "/tmp/openclaw-pnpm-virtual-store"
jobs:
hydrate:
@@ -45,12 +45,12 @@ jobs:
runs-on: [self-hosted, "${{ inputs.crabbox_runner_label }}"]
timeout-minutes: 120
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
- uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
uses: actions/setup-node@v6
with:
node-version: "24"
@@ -120,27 +120,6 @@ jobs:
append_pnpm_option_arg PNPM_CONFIG_MODULES_DIR modules-dir
append_pnpm_option_arg PNPM_CONFIG_NETWORK_CONCURRENCY network-concurrency
append_pnpm_option_arg PNPM_CONFIG_VIRTUAL_STORE_DIR virtual-store-dir
require_safe_writable_dir() {
local dir="$1"
if [ -L "$dir" ] || [ ! -d "$dir" ] || [ ! -w "$dir" ]; then
echo "::error::Refusing unsafe pnpm directory: $dir"
exit 1
fi
}
prepare_crabbox_pnpm_dirs() {
local volatile_root="/var/tmp/openclaw-pnpm"
case "${PNPM_CONFIG_MODULES_DIR:?}" in "$volatile_root"/*) ;; *) echo "::error::PNPM_CONFIG_MODULES_DIR must stay under $volatile_root"; exit 1 ;; esac
case "${PNPM_CONFIG_VIRTUAL_STORE_DIR:?}" in "$volatile_root"/*) ;; *) echo "::error::PNPM_CONFIG_VIRTUAL_STORE_DIR must stay under $volatile_root"; exit 1 ;; esac
rm -rf -- "$volatile_root"
mkdir -p "$volatile_root" "$PNPM_CONFIG_STORE_DIR"
require_safe_writable_dir "$volatile_root"
require_safe_writable_dir "$PNPM_CONFIG_STORE_DIR"
mkdir -p "$PNPM_CONFIG_MODULES_DIR" "$PNPM_CONFIG_VIRTUAL_STORE_DIR"
}
prepare_crabbox_pnpm_dirs
if [ -L node_modules ] && [ "$(readlink node_modules)" = "${PNPM_CONFIG_MODULES_DIR:-}" ]; then
rm -f node_modules
fi
if [ -n "${PNPM_CONFIG_MODULES_DIR:-}" ]; then
mkdir -p "$PNPM_CONFIG_MODULES_DIR"
ln -sfn . "$PNPM_CONFIG_MODULES_DIR/node_modules"
@@ -328,12 +307,12 @@ jobs:
runs-on: [self-hosted, "${{ inputs.crabbox_runner_label }}"]
timeout-minutes: 120
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
- uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
uses: actions/setup-node@v6
with:
node-version: "24"
@@ -378,10 +357,9 @@ jobs:
$env:XDG_CACHE_HOME = Join-Path $cacheRoot "cache"
$env:COREPACK_HOME = Join-Path $env:XDG_CACHE_HOME "corepack"
$env:PNPM_HOME = Join-Path $cacheRoot "pnpm-home"
$pnpmCacheRoot = Join-Path $cacheRoot "openclaw-pnpm"
$env:PNPM_CONFIG_STORE_DIR = Join-Path $pnpmCacheRoot "store"
$env:PNPM_CONFIG_MODULES_DIR = Join-Path $pnpmCacheRoot "node_modules"
$env:PNPM_CONFIG_VIRTUAL_STORE_DIR = Join-Path $pnpmCacheRoot "virtual-store"
$env:PNPM_CONFIG_STORE_DIR = Join-Path $cacheRoot "openclaw-pnpm-store"
$env:PNPM_CONFIG_MODULES_DIR = Join-Path $cacheRoot "openclaw-pnpm-node-modules"
$env:PNPM_CONFIG_VIRTUAL_STORE_DIR = Join-Path $env:PNPM_CONFIG_MODULES_DIR ".pnpm"
$env:PNPM_CONFIG_CHILD_CONCURRENCY = "4"
$env:PNPM_CONFIG_NETWORK_CONCURRENCY = "8"
$env:PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN = "false"
@@ -561,7 +539,7 @@ jobs:
runs-on: [self-hosted, "${{ inputs.crabbox_runner_label }}"]
timeout-minutes: 120
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
- uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}

View File

@@ -4,7 +4,6 @@ on:
push:
tags:
- "v*"
- "!v*-alpha.*"
paths-ignore:
- "docs/**"
- "**/*.md"
@@ -39,17 +38,13 @@ jobs:
RELEASE_TAG: ${{ inputs.tag }}
run: |
set -euo pipefail
if [[ "${RELEASE_TAG}" == *"-alpha."* ]]; then
echo "Docker alpha image publishing is disabled."
exit 1
fi
if [[ ! "${RELEASE_TAG}" =~ ^v[0-9]{4}\.[1-9][0-9]*\.[1-9][0-9]*(-beta\.[1-9][0-9]*)?$ ]]; then
if [[ ! "${RELEASE_TAG}" =~ ^v[0-9]{4}\.[1-9][0-9]*\.[1-9][0-9]*(-(alpha|beta)\.[1-9][0-9]*)?$ ]]; then
echo "Invalid release tag: ${RELEASE_TAG}"
exit 1
fi
- name: Checkout selected tag
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: refs/tags/${{ inputs.tag }}
fetch-depth: 0
@@ -83,35 +78,16 @@ jobs:
browser_digest: ${{ steps.build-browser.outputs.digest }}
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ github.event_name == 'workflow_dispatch' && format('refs/tags/{0}', inputs.tag) || github.ref }}
fetch-depth: 0
- name: Pre-pull BuildKit image
shell: bash
env:
BUILDKIT_IMAGE: moby/buildkit:buildx-stable-1
run: |
set -euo pipefail
for attempt in 1 2 3 4; do
if docker pull "${BUILDKIT_IMAGE}"; then
exit 0
fi
if [[ "${attempt}" == "4" ]]; then
echo "::error::Failed to pull ${BUILDKIT_IMAGE} after ${attempt} attempts"
exit 1
fi
sleep_seconds=$((attempt * 10))
echo "BuildKit image pull failed; retrying in ${sleep_seconds}s (${attempt}/4)."
sleep "${sleep_seconds}"
done
- name: Set up Docker Builder
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
- name: Login to GitHub Container Registry
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}
@@ -180,7 +156,7 @@ jobs:
- name: Build and push amd64 image
id: build
# WARNING: KEEP THE OFFICIAL DOCKER ACTION HERE; DO NOT SWITCH THIS BACK TO BLACKSMITH BLINDLY.
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
platforms: linux/amd64
@@ -198,7 +174,7 @@ jobs:
id: build-browser
if: steps.tags.outputs.browser != ''
# WARNING: KEEP THE OFFICIAL DOCKER ACTION HERE; DO NOT SWITCH THIS BACK TO BLACKSMITH BLINDLY.
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
platforms: linux/amd64
@@ -293,35 +269,16 @@ jobs:
browser_digest: ${{ steps.build-browser.outputs.digest }}
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ github.event_name == 'workflow_dispatch' && format('refs/tags/{0}', inputs.tag) || github.ref }}
fetch-depth: 0
- name: Pre-pull BuildKit image
shell: bash
env:
BUILDKIT_IMAGE: moby/buildkit:buildx-stable-1
run: |
set -euo pipefail
for attempt in 1 2 3 4; do
if docker pull "${BUILDKIT_IMAGE}"; then
exit 0
fi
if [[ "${attempt}" == "4" ]]; then
echo "::error::Failed to pull ${BUILDKIT_IMAGE} after ${attempt} attempts"
exit 1
fi
sleep_seconds=$((attempt * 10))
echo "BuildKit image pull failed; retrying in ${sleep_seconds}s (${attempt}/4)."
sleep "${sleep_seconds}"
done
- name: Set up Docker Builder
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
- name: Login to GitHub Container Registry
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}
@@ -390,7 +347,7 @@ jobs:
- name: Build and push arm64 image
id: build
# WARNING: KEEP THE OFFICIAL DOCKER ACTION HERE; DO NOT SWITCH THIS BACK TO BLACKSMITH BLINDLY.
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
platforms: linux/arm64
@@ -408,7 +365,7 @@ jobs:
id: build-browser
if: steps.tags.outputs.browser != ''
# WARNING: KEEP THE OFFICIAL DOCKER ACTION HERE; DO NOT SWITCH THIS BACK TO BLACKSMITH BLINDLY.
uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
with:
context: .
platforms: linux/arm64
@@ -500,13 +457,13 @@ jobs:
contents: read
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ github.event_name == 'workflow_dispatch' && format('refs/tags/{0}', inputs.tag) || github.ref }}
fetch-depth: 0
- name: Login to GitHub Container Registry
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}
@@ -595,34 +552,15 @@ jobs:
packages: read
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
fetch-depth: 1
- name: Pre-pull BuildKit image
shell: bash
env:
BUILDKIT_IMAGE: moby/buildkit:buildx-stable-1
run: |
set -euo pipefail
for attempt in 1 2 3 4; do
if docker pull "${BUILDKIT_IMAGE}"; then
exit 0
fi
if [[ "${attempt}" == "4" ]]; then
echo "::error::Failed to pull ${BUILDKIT_IMAGE} after ${attempt} attempts"
exit 1
fi
sleep_seconds=$((attempt * 10))
echo "BuildKit image pull failed; retrying in ${sleep_seconds}s (${attempt}/4)."
sleep "${sleep_seconds}"
done
- name: Set up Docker Builder
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
- name: Login to GitHub Container Registry
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.repository_owner }}

View File

@@ -33,7 +33,7 @@ jobs:
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: main
fetch-depth: 0
@@ -149,7 +149,7 @@ jobs:
- name: Run Codex docs agent
if: steps.gate.outputs.run_agent == 'true'
uses: openai/codex-action@e0fdf01220eb9a88167c4898839d273e3f2609d1
uses: openai/codex-action@5c3f4ccdb2b8790f73d6b21751ac00e602aa0c02
env:
DOCS_AGENT_BASE_SHA: ${{ steps.gate.outputs.review_base_sha }}
DOCS_AGENT_HEAD_SHA: ${{ steps.gate.outputs.review_head_sha }}

View File

@@ -25,13 +25,13 @@ jobs:
- name: Checkout source repo
if: env.OPENCLAW_DOCS_SYNC_TOKEN != ''
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Checkout ClawHub docs source
if: env.OPENCLAW_DOCS_SYNC_TOKEN != ''
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
repository: openclaw/clawhub
path: clawhub-source
@@ -41,7 +41,7 @@ jobs:
- name: Setup Node
if: env.OPENCLAW_DOCS_SYNC_TOKEN != ''
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
uses: actions/setup-node@v6
with:
node-version: "24.x"

View File

@@ -24,7 +24,7 @@ jobs:
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
fetch-depth: 1
fetch-tags: false
@@ -37,7 +37,7 @@ jobs:
install-bun: "false"
- name: Checkout ClawHub docs source
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
repository: openclaw/clawhub
path: clawhub-source

View File

@@ -35,7 +35,8 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
- name: Close confirmed duplicates
env:
APPLY: ${{ inputs.apply }}

View File

@@ -36,7 +36,7 @@ on:
- stable
- full
run_release_soak:
description: Run exhaustive live/Docker and upgrade-survivor soak lanes; forced on for stable and full release profiles
description: Run exhaustive live/Docker and upgrade-survivor soak lanes; forced on for release_profile=full
required: false
default: false
type: boolean
@@ -130,7 +130,7 @@ jobs:
sha: ${{ steps.resolve.outputs.sha }}
steps:
- name: Checkout trusted workflow helper
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ github.ref_name }}
path: workflow
@@ -158,7 +158,7 @@ jobs:
PACKAGE_ACCEPTANCE_PACKAGE_SPEC: ${{ inputs.package_acceptance_package_spec }}
CODEX_PLUGIN_SPEC: ${{ inputs.codex_plugin_spec }}
RELEASE_PROFILE: ${{ inputs.release_profile }}
RUN_RELEASE_SOAK: ${{ inputs.run_release_soak || inputs.release_profile == 'stable' || inputs.release_profile == 'full' }}
RUN_RELEASE_SOAK: ${{ inputs.run_release_soak || inputs.release_profile == 'full' }}
RERUN_GROUP: ${{ inputs.rerun_group }}
LIVE_SUITE_FILTER: ${{ inputs.live_suite_filter }}
CROSS_OS_SUITE_FILTER: ${{ inputs.cross_os_suite_filter }}
@@ -229,12 +229,12 @@ jobs:
needs: [resolve_target]
if: inputs.rerun_group == 'all'
runs-on: ubuntu-24.04
timeout-minutes: 20
timeout-minutes: 45
permissions:
contents: read
steps:
- name: Checkout target SHA
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ needs.resolve_target.outputs.sha }}
fetch-depth: 1
@@ -245,11 +245,54 @@ jobs:
DOCKER_BUILDKIT: "1"
run: |
set -euo pipefail
timeout --kill-after=30s 15m docker build \
timeout --kill-after=30s 35m docker build \
--target runtime-assets \
--build-arg OPENCLAW_EXTENSIONS="diagnostics-otel,codex" \
.
- name: Build and smoke test final Docker runtime image
env:
DOCKER_BUILDKIT: "1"
TARGET_SHA: ${{ needs.resolve_target.outputs.sha }}
run: |
set -euo pipefail
image_ref="openclaw-release-runtime-smoke:${TARGET_SHA}"
timeout --kill-after=30s 35m docker build \
--build-arg OPENCLAW_EXTENSIONS="diagnostics-otel,codex" \
-t "${image_ref}" \
.
docker run --rm --entrypoint /bin/sh "${image_ref}" -lc '
set -eu
test -f /app/src/agents/templates/HEARTBEAT.md
temp_root="$(mktemp -d)"
trap "rm -rf \"${temp_root}\"" EXIT
mkdir -p "${temp_root}/home" "${temp_root}/cwd"
cd "${temp_root}/cwd"
set +e
HOME="${temp_root}/home" \
USERPROFILE="${temp_root}/home" \
OPENCLAW_HOME="${temp_root}/home" \
OPENCLAW_NO_ONBOARD=1 \
OPENCLAW_SUPPRESS_NOTES=1 \
OPENCLAW_DISABLE_BUNDLED_PLUGINS=1 \
OPENCLAW_DISABLE_BUNDLED_ENTRY_SOURCE_FALLBACK=1 \
AWS_EC2_METADATA_DISABLED=true \
AWS_SHARED_CREDENTIALS_FILE="${temp_root}/home/.aws/credentials" \
AWS_CONFIG_FILE="${temp_root}/home/.aws/config" \
node /app/openclaw.mjs agent --message "workspace bootstrap smoke" --session-id "workspace-bootstrap-smoke" --local --timeout 1 --json \
>"${temp_root}/out.log" 2>&1
status="$?"
set -e
if grep -F "Missing workspace template:" "${temp_root}/out.log"; then
cat "${temp_root}/out.log"
exit 1
fi
test -f "${temp_root}/home/.openclaw/workspace/HEARTBEAT.md"
if [ "${status}" -ne 0 ]; then
cat "${temp_root}/out.log"
fi
'
normal_ci:
name: Run normal full CI
needs: [resolve_target, docker_runtime_assets_preflight]
@@ -275,7 +318,7 @@ jobs:
local workflow="$1"
shift
local dispatch_output run_id status conclusion url poll_count
local before_json dispatch_output run_id status conclusion url poll_count
gh_with_retry() {
local output status attempt
for attempt in 1 2 3 4 5 6; do
@@ -298,6 +341,8 @@ jobs:
printf '%s\n' "$output" >&2
return "$status"
}
before_json="$(gh_with_retry run list --workflow "$workflow" --event workflow_dispatch --limit 100 --json databaseId --jq '[.[].databaseId]')"
dispatch_output="$(gh_with_retry workflow run "$workflow" --ref "$CHILD_WORKFLOW_REF" "$@")"
printf '%s\n' "$dispatch_output"
run_id="$(
@@ -307,7 +352,20 @@ jobs:
)"
if [[ -z "$run_id" ]]; then
echo "::error::gh workflow run ${workflow} did not return an Actions run URL; refusing to guess from recent workflow_dispatch runs." >&2
for _ in $(seq 1 60); do
run_id="$(
BEFORE_IDS="$before_json" gh_with_retry run list --workflow "$workflow" --event workflow_dispatch --limit 50 --json databaseId,createdAt \
--jq 'map(select(.databaseId as $id | (env.BEFORE_IDS | fromjson | index($id) | not))) | sort_by(.createdAt) | reverse | .[0].databaseId // empty'
)"
if [[ -n "$run_id" ]]; then
break
fi
sleep 5
done
fi
if [[ -z "${run_id:-}" ]]; then
echo "Could not find dispatched run for ${workflow}." >&2
exit 1
fi
@@ -408,7 +466,7 @@ jobs:
local workflow="$1"
shift
local dispatch_output run_id status conclusion url poll_count
local before_json dispatch_output run_id status conclusion url poll_count
gh_with_retry() {
local output status attempt
for attempt in 1 2 3 4 5 6; do
@@ -431,6 +489,8 @@ jobs:
printf '%s\n' "$output" >&2
return "$status"
}
before_json="$(gh_with_retry run list --workflow "$workflow" --event workflow_dispatch --limit 100 --json databaseId --jq '[.[].databaseId]')"
dispatch_output="$(gh_with_retry workflow run "$workflow" --ref "$CHILD_WORKFLOW_REF" "$@")"
printf '%s\n' "$dispatch_output"
run_id="$(
@@ -440,7 +500,20 @@ jobs:
)"
if [[ -z "$run_id" ]]; then
echo "::error::gh workflow run ${workflow} did not return an Actions run URL; refusing to guess from recent workflow_dispatch runs." >&2
for _ in $(seq 1 60); do
run_id="$(
BEFORE_IDS="$before_json" gh_with_retry run list --workflow "$workflow" --event workflow_dispatch --limit 50 --json databaseId,createdAt \
--jq 'map(select(.databaseId as $id | (env.BEFORE_IDS | fromjson | index($id) | not))) | sort_by(.createdAt) | reverse | .[0].databaseId // empty'
)"
if [[ -n "$run_id" ]]; then
break
fi
sleep 5
done
fi
if [[ -z "${run_id:-}" ]]; then
echo "Could not find dispatched run for ${workflow}." >&2
exit 1
fi
@@ -537,7 +610,7 @@ jobs:
PROVIDER: ${{ inputs.provider }}
MODE: ${{ inputs.mode }}
RELEASE_PROFILE: ${{ inputs.release_profile }}
RUN_RELEASE_SOAK: ${{ inputs.run_release_soak || inputs.release_profile == 'stable' || inputs.release_profile == 'full' }}
RUN_RELEASE_SOAK: ${{ inputs.run_release_soak || inputs.release_profile == 'full' }}
RERUN_GROUP: ${{ inputs.rerun_group }}
LIVE_SUITE_FILTER: ${{ inputs.live_suite_filter }}
CROSS_OS_SUITE_FILTER: ${{ inputs.cross_os_suite_filter }}
@@ -551,7 +624,7 @@ jobs:
local workflow="$1"
shift
local dispatch_output run_id status conclusion url poll_count run_json
local before_json dispatch_output run_id status conclusion url poll_count run_json
gh_with_retry() {
local output status attempt
for attempt in 1 2 3 4 5 6; do
@@ -574,6 +647,8 @@ jobs:
printf '%s\n' "$output" >&2
return "$status"
}
before_json="$(gh_with_retry run list --workflow "$workflow" --event workflow_dispatch --limit 100 --json databaseId --jq '[.[].databaseId]')"
dispatch_output="$(gh_with_retry workflow run "$workflow" --ref "$CHILD_WORKFLOW_REF" "$@")"
printf '%s\n' "$dispatch_output"
run_id="$(
@@ -583,7 +658,20 @@ jobs:
)"
if [[ -z "$run_id" ]]; then
echo "::error::gh workflow run ${workflow} did not return an Actions run URL; refusing to guess from recent workflow_dispatch runs." >&2
for _ in $(seq 1 60); do
run_id="$(
BEFORE_IDS="$before_json" gh_with_retry run list --workflow "$workflow" --event workflow_dispatch --limit 50 --json databaseId,createdAt \
--jq 'map(select(.databaseId as $id | (env.BEFORE_IDS | fromjson | index($id) | not))) | sort_by(.createdAt) | reverse | .[0].databaseId // empty'
)"
if [[ -n "$run_id" ]]; then
break
fi
sleep 5
done
fi
if [[ -z "${run_id:-}" ]]; then
echo "Could not find dispatched run for ${workflow}." >&2
exit 1
fi
@@ -738,7 +826,7 @@ jobs:
fi
args=(
-f ref="$TARGET_REF"
-f ref="$TARGET_SHA"
-f expected_sha="$TARGET_SHA"
-f provider="$PROVIDER"
-f mode="$MODE"
@@ -780,7 +868,7 @@ jobs:
source_sha: ${{ steps.package.outputs.source_sha }}
steps:
- name: Checkout trusted workflow ref
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
persist-credentials: true
ref: ${{ github.ref_name }}
@@ -826,7 +914,7 @@ jobs:
} >> "$GITHUB_STEP_SUMMARY"
- name: Upload release package artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v7
with:
name: release-package-under-test
path: |
@@ -883,6 +971,8 @@ jobs:
return "$status"
}
before_json="$(gh_with_retry run list --workflow npm-telegram-beta-e2e.yml --event workflow_dispatch --limit 100 --json databaseId --jq '[.[].databaseId]')"
args=(-f package_spec="${PACKAGE_SPEC:-openclaw@beta}" -f harness_ref="$TARGET_SHA" -f provider_mode="$PROVIDER_MODE")
if [[ -z "${PACKAGE_SPEC// }" ]]; then
if [[ "$PREPARE_PACKAGE_RESULT" != "success" || -z "${PACKAGE_ARTIFACT_NAME// }" ]]; then
@@ -899,16 +989,22 @@ jobs:
args+=(-f scenario="$SCENARIO")
fi
dispatch_output="$(gh_with_retry workflow run npm-telegram-beta-e2e.yml --ref "$CHILD_WORKFLOW_REF" "${args[@]}")"
printf '%s\n' "$dispatch_output"
run_id="$(
printf '%s\n' "$dispatch_output" |
sed -nE 's#.*actions/runs/([0-9]+).*#\1#p' |
tail -n 1
)"
gh_with_retry workflow run npm-telegram-beta-e2e.yml --ref "$CHILD_WORKFLOW_REF" "${args[@]}"
run_id=""
for _ in $(seq 1 60); do
run_id="$(
BEFORE_IDS="$before_json" gh_with_retry run list --workflow npm-telegram-beta-e2e.yml --event workflow_dispatch --limit 50 --json databaseId,createdAt \
--jq 'map(select(.databaseId as $id | (env.BEFORE_IDS | fromjson | index($id) | not))) | sort_by(.createdAt) | reverse | .[0].databaseId // empty'
)"
if [[ -n "$run_id" ]]; then
break
fi
sleep 5
done
if [[ -z "$run_id" ]]; then
echo "::error::gh workflow run npm-telegram-beta-e2e.yml did not return an Actions run URL; refusing to guess from recent workflow_dispatch runs." >&2
echo "Could not find dispatched run for npm-telegram-beta-e2e.yml." >&2
exit 1
fi
@@ -1017,30 +1113,25 @@ jobs:
echo "- Repeat: \`3\`"
echo "- Deep profile: \`false\`"
echo "- Live OpenAI candidate: \`false\`"
echo "- Release impact: blocking"
echo "- Release impact: advisory"
} >> "$GITHUB_STEP_SUMMARY"
dispatch_id="full-release-validation-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
dispatch_run_name="OpenClaw Performance ${dispatch_id}"
before_json="$(gh_with_retry run list --workflow openclaw-performance.yml --event workflow_dispatch --limit 100 --json databaseId --jq '[.[].databaseId]')"
dispatch_output="$(gh_with_retry workflow run openclaw-performance.yml \
gh_with_retry workflow run openclaw-performance.yml \
--ref "$CHILD_WORKFLOW_REF" \
-f target_ref="$TARGET_SHA" \
-f profile=release \
-f repeat=3 \
-f deep_profile=false \
-f live_openai_candidate=false \
-f fail_on_regression=true \
-f dispatch_id="$dispatch_id")"
printf '%s\n' "$dispatch_output"
-f fail_on_regression=false
run_id=""
for _ in $(seq 1 60); do
run_id="$(
DISPATCH_RUN_NAME="$dispatch_run_name" gh_with_retry api -X GET "repos/${GITHUB_REPOSITORY}/actions/workflows/openclaw-performance.yml/runs" \
-F event=workflow_dispatch \
-F per_page=100 \
--jq '.workflow_runs | map(select(.display_title == env.DISPATCH_RUN_NAME)) | sort_by(.created_at) | reverse | .[0].id // empty'
BEFORE_IDS="$before_json" gh_with_retry run list --workflow openclaw-performance.yml --event workflow_dispatch --limit 50 --json databaseId,createdAt \
--jq 'map(select(.databaseId as $id | (env.BEFORE_IDS | fromjson | index($id) | not))) | sort_by(.createdAt) | reverse | .[0].databaseId // empty'
)"
if [[ -n "$run_id" ]]; then
break
@@ -1049,8 +1140,8 @@ jobs:
done
if [[ -z "$run_id" ]]; then
echo "::error::Could not find dispatched run for ${dispatch_run_name}." >&2
exit 1
echo "::warning::Could not find dispatched run for openclaw-performance.yml."
exit 0
fi
echo "Dispatched openclaw-performance.yml: https://github.com/${GITHUB_REPOSITORY}/actions/runs/${run_id}"
@@ -1085,23 +1176,13 @@ jobs:
echo "url=${url}" >> "$GITHUB_OUTPUT"
echo "conclusion=${conclusion}" >> "$GITHUB_OUTPUT"
if [[ "$conclusion" != "success" ]]; then
echo "::error::OpenClaw Performance ended with ${conclusion}: ${url}"
echo "::warning::OpenClaw Performance is advisory and ended with ${conclusion}: ${url}"
gh_with_retry run view "$run_id" --json jobs --jq '.jobs[] | select(.conclusion != "success" and .conclusion != "skipped") | {name, conclusion, url}' || true
exit 1
fi
summary:
name: Verify full validation
needs:
[
resolve_target,
docker_runtime_assets_preflight,
normal_ci,
plugin_prerelease,
release_checks,
npm_telegram,
performance,
]
needs: [resolve_target, docker_runtime_assets_preflight, normal_ci, plugin_prerelease, release_checks, npm_telegram, performance]
if: always()
runs-on: ubuntu-24.04
timeout-minutes: 5
@@ -1378,7 +1459,6 @@ jobs:
normal_ci_required=0
plugin_prerelease_required=0
release_checks_required=0
performance_required=0
if [[ "$RERUN_GROUP" == "all" && "$DOCKER_RUNTIME_ASSETS_PREFLIGHT_RESULT" != "success" ]]; then
echo "::error::Docker runtime-assets preflight ended with ${DOCKER_RUNTIME_ASSETS_PREFLIGHT_RESULT}."
failed=1
@@ -1386,7 +1466,6 @@ jobs:
normal_ci_required=1
plugin_prerelease_required=1
release_checks_required=1
performance_required=1
else
case "$RERUN_GROUP" in
ci)
@@ -1398,9 +1477,6 @@ jobs:
release-checks|install-smoke|cross-os|live-e2e|package|qa|qa-parity|qa-live)
release_checks_required=1
;;
performance)
performance_required=1
;;
esac
fi
@@ -1434,12 +1510,6 @@ jobs:
check_child "npm_telegram" "$NPM_TELEGRAM_RUN_ID" 1 || failed=1
fi
if [[ "$PERFORMANCE_RESULT" == "skipped" && -z "${PERFORMANCE_RUN_ID// }" ]]; then
check_child "product_performance" "" "$performance_required" || failed=1
else
check_child "product_performance" "$PERFORMANCE_RUN_ID" "$performance_required" || failed=1
fi
summarize_child_timing "normal_ci" "$NORMAL_CI_RUN_ID"
summarize_child_timing "plugin_prerelease" "$PLUGIN_PRERELEASE_RUN_ID"
summarize_child_timing "release_checks" "$RELEASE_CHECKS_RUN_ID"
@@ -1451,7 +1521,6 @@ jobs:
summarize_failed_child "plugin_prerelease" "$PLUGIN_PRERELEASE_RUN_ID"
summarize_failed_child "release_checks" "$RELEASE_CHECKS_RUN_ID"
summarize_failed_child "npm_telegram" "$NPM_TELEGRAM_RUN_ID"
summarize_failed_child "product_performance" "$PERFORMANCE_RUN_ID"
fi
exit "$failed"
@@ -1538,13 +1607,12 @@ jobs:
TARGET_SHA: ${{ needs.resolve_target.outputs.sha }}
RELEASE_PROFILE: ${{ inputs.release_profile }}
RERUN_GROUP: ${{ inputs.rerun_group }}
RUN_RELEASE_SOAK: ${{ inputs.run_release_soak || inputs.release_profile == 'stable' || inputs.release_profile == 'full' }}
RUN_RELEASE_SOAK: ${{ inputs.run_release_soak || inputs.release_profile == 'full' }}
NORMAL_CI_RUN_ID: ${{ needs.normal_ci.outputs.run_id }}
PLUGIN_PRERELEASE_RUN_ID: ${{ needs.plugin_prerelease.outputs.run_id }}
RELEASE_CHECKS_RUN_ID: ${{ needs.release_checks.outputs.run_id }}
NPM_TELEGRAM_RUN_ID: ${{ needs.npm_telegram.outputs.run_id }}
PERFORMANCE_RUN_ID: ${{ needs.performance.outputs.run_id }}
PERFORMANCE_CONCLUSION: ${{ needs.performance.outputs.conclusion }}
run: |
set -euo pipefail
manifest_dir="${RUNNER_TEMP}/full-release-validation"
@@ -1564,9 +1632,8 @@ jobs:
--arg releaseChecksRunId "$RELEASE_CHECKS_RUN_ID" \
--arg npmTelegramRunId "$NPM_TELEGRAM_RUN_ID" \
--arg performanceRunId "$PERFORMANCE_RUN_ID" \
--arg performanceConclusion "$PERFORMANCE_CONCLUSION" \
'{
version: 2,
version: 1,
workflowName: $workflowName,
runId: $runId,
runAttempt: $runAttempt,
@@ -1576,26 +1643,18 @@ jobs:
releaseProfile: $releaseProfile,
rerunGroup: $rerunGroup,
runReleaseSoak: $runReleaseSoak,
controls: {
stableSoakRequired: ($releaseProfile == "stable" or $releaseProfile == "full"),
performanceBlocking: true
},
childRuns: {
normalCi: $normalCiRunId,
pluginPrerelease: $pluginPrereleaseRunId,
releaseChecks: $releaseChecksRunId,
npmTelegram: $npmTelegramRunId,
productPerformance: {
runId: $performanceRunId,
conclusion: $performanceConclusion,
blocking: true
}
productPerformance: $performanceRunId
}
}' > "${manifest_dir}/full-release-validation-manifest.json"
- name: Upload release validation manifest
if: ${{ success() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
uses: actions/upload-artifact@v7
with:
name: full-release-validation-${{ github.run_id }}
path: ${{ runner.temp }}/full-release-validation

View File

@@ -56,7 +56,7 @@ jobs:
dockerfile_image: ${{ steps.manifest.outputs.dockerfile_image }}
steps:
- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
fetch-depth: 1
@@ -106,13 +106,13 @@ jobs:
DOCKER_BUILD_RECORD_UPLOAD: "false"
steps:
- name: Checkout CLI
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
persist-credentials: false
- name: Set up Blacksmith Docker Builder
uses: useblacksmith/setup-docker-builder@ab5c1da94f53f5cd75c1038092aa276dddfccbba # v1
uses: useblacksmith/setup-docker-builder@722e97d12b1d06a961800dd6c05d79d951ad3c80 # v1
with:
max-cache-size-mb: 800000
@@ -217,13 +217,13 @@ jobs:
DOCKER_BUILD_RECORD_UPLOAD: "false"
steps:
- name: Checkout CLI
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
persist-credentials: false
- name: Log in to GHCR
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -245,7 +245,7 @@ jobs:
- name: Set up Blacksmith Docker Builder
if: steps.existing.outputs.exists != 'true'
uses: useblacksmith/setup-docker-builder@ab5c1da94f53f5cd75c1038092aa276dddfccbba # v1
uses: useblacksmith/setup-docker-builder@722e97d12b1d06a961800dd6c05d79d951ad3c80 # v1
with:
max-cache-size-mb: 800000
@@ -289,7 +289,7 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout CLI
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
persist-credentials: false
@@ -305,13 +305,13 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout CLI
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
persist-credentials: false
- name: Log in to GHCR
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -411,13 +411,13 @@ jobs:
DOCKER_BUILD_RECORD_UPLOAD: "false"
steps:
- name: Checkout CLI
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
persist-credentials: false
- name: Log in to GHCR
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -429,7 +429,7 @@ jobs:
run: timeout --kill-after=30s 600s docker pull "$IMAGE_REF"
- name: Set up Blacksmith Docker Builder
uses: useblacksmith/setup-docker-builder@ab5c1da94f53f5cd75c1038092aa276dddfccbba # v1
uses: useblacksmith/setup-docker-builder@722e97d12b1d06a961800dd6c05d79d951ad3c80 # v1
with:
max-cache-size-mb: 800000
@@ -476,21 +476,19 @@ jobs:
- name: Run Rocky Linux installer smoke
run: |
timeout --kill-after=30s 20m docker run --rm \
--platform linux/amd64 \
-e OPENCLAW_NO_ONBOARD=1 \
-e OPENCLAW_NO_PROMPT=1 \
-v "$PWD/scripts/install.sh:/tmp/install.sh:ro" \
rockylinux:9@sha256:d644d203142cd5b54ad2a83a203e1dee68af2229f8fe32f52a30c6e1d3c3a9e0 \
rockylinux:9@sha256:d7be1c094cc5845ee815d4632fe377514ee6ebcf8efaed6892889657e5ddaaa6 \
bash -lc 'dnf install -y -q ca-certificates tar gzip xz findutils which sudo >/dev/null && bash /tmp/install.sh --install-method npm --version latest --no-onboard --no-prompt --verify && openclaw --version'
- name: Run Rocky Linux CLI installer smoke
run: |
timeout --kill-after=30s 20m docker run --rm \
--platform linux/amd64 \
-e OPENCLAW_NO_ONBOARD=1 \
-e OPENCLAW_NO_PROMPT=1 \
-v "$PWD/scripts/install-cli.sh:/tmp/install-cli.sh:ro" \
rockylinux:9@sha256:d644d203142cd5b54ad2a83a203e1dee68af2229f8fe32f52a30c6e1d3c3a9e0 \
rockylinux:9@sha256:d7be1c094cc5845ee815d4632fe377514ee6ebcf8efaed6892889657e5ddaaa6 \
bash -lc 'dnf install -y -q ca-certificates tar gzip xz findutils which sudo >/dev/null && bash /tmp/install-cli.sh --prefix /tmp/openclaw-cli --version latest --no-onboard && /tmp/openclaw-cli/bin/openclaw --version'
bun_global_install_smoke:
@@ -499,13 +497,13 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Checkout CLI
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
persist-credentials: false
- name: Log in to GHCR
uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -538,13 +536,13 @@ jobs:
DOCKER_BUILD_RECORD_UPLOAD: "false"
steps:
- name: Checkout CLI
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
uses: actions/checkout@v6
with:
ref: ${{ inputs.ref || github.ref }}
persist-credentials: false
- name: Set up Blacksmith Docker Builder
uses: useblacksmith/setup-docker-builder@ab5c1da94f53f5cd75c1038092aa276dddfccbba # v1
uses: useblacksmith/setup-docker-builder@722e97d12b1d06a961800dd6c05d79d951ad3c80 # v1
with:
max-cache-size-mb: 800000

View File

@@ -1,447 +0,0 @@
name: iOS Periphery Dead Code Comment
on:
workflow_run: # zizmor: ignore[dangerous-triggers] trusted PR commenter; job gates repository, source event, workflow name, live open PR, and exact current head before reading artifacts or writing comments
workflows: ["iOS Periphery Dead Code"]
types: [completed]
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
permissions:
actions: read
contents: read
issues: write
pull-requests: read
jobs:
comment:
name: Comment on PR
runs-on: ubuntu-24.04
if: >
github.repository == 'openclaw/openclaw' &&
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.name == 'iOS Periphery Dead Code'
steps:
- name: Upsert Periphery PR comment
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9
with:
script: |
const fs = require("node:fs");
const os = require("node:os");
const path = require("node:path");
const childProcess = require("node:child_process");
const marker = "<!-- openclaw-ios-periphery-dead-code -->";
const run = context.payload.workflow_run;
const pr = run.pull_requests?.[0];
if (!pr) {
core.info("No pull request attached to workflow_run.");
return;
}
const { owner, repo } = context.repo;
const repository = `${owner}/${repo}`;
if (run.repository?.full_name !== repository) {
core.info(`Skipping workflow_run from ${run.repository?.full_name ?? "unknown repository"}.`);
return;
}
if (run.event !== "pull_request") {
core.info(`Skipping workflow_run for ${run.event ?? "unknown"} event.`);
return;
}
if (run.name !== "iOS Periphery Dead Code") {
core.info(`Skipping unexpected workflow ${run.name ?? "unknown"}.`);
return;
}
const livePull = await github.rest.pulls.get({
owner,
repo,
pull_number: pr.number,
});
if (livePull.data.state !== "open") {
core.info(`Skipping closed PR #${pr.number}.`);
return;
}
if (livePull.data.base?.repo?.full_name !== repository) {
core.info(`Skipping PR #${pr.number} targeting ${livePull.data.base?.repo?.full_name ?? "unknown repository"}.`);
return;
}
if (livePull.data.head?.sha !== run.head_sha) {
core.info(`Skipping stale run ${run.id}; PR #${pr.number} is now at ${livePull.data.head?.sha}.`);
return;
}
const jobs = await github.paginate(github.rest.actions.listJobsForWorkflowRun, {
owner,
repo,
run_id: run.id,
filter: "latest",
per_page: 100,
});
const scopeJob = jobs.find((job) => job.name === "Detect iOS scan scope");
const scanJob = jobs.find((job) => job.name === "Scan iOS dead code");
const scanSkipped =
scopeJob?.conclusion === "success" && scanJob?.conclusion === "skipped";
if (scanSkipped) {
core.info(`Skipping intentionally omitted Periphery scan for PR #${pr.number}.`);
}
const artifacts = scanSkipped
? []
: await github.paginate(github.rest.actions.listWorkflowRunArtifacts, {
owner,
repo,
run_id: run.id,
per_page: 100,
});
const readReport = async () => {
if (scanSkipped) {
return;
}
const artifactName = `ios-periphery-dead-code-${run.id}-${run.run_attempt}`;
const artifact = artifacts.find((item) => item.name === artifactName);
if (!artifact) {
core.warning(`No ${artifactName} artifact found.`);
return;
}
if (artifact.expired) {
core.warning(`${artifactName} artifact expired.`);
return;
}
const maxArchiveBytes = 1024 * 1024;
const archiveSize = Number(artifact.size_in_bytes);
if (!Number.isSafeInteger(archiveSize) || archiveSize < 0 || archiveSize > maxArchiveBytes) {
core.warning(`Skipping ${artifactName}; compressed artifact size ${artifact.size_in_bytes ?? "unknown"} exceeds the ${maxArchiveBytes} byte limit.`);
return;
}
const archive = await github.rest.actions.downloadArtifact({
owner,
repo,
artifact_id: artifact.id,
archive_format: "zip",
});
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "ios-periphery-"));
const archivePath = path.join(dir, "artifact.zip");
const archiveBuffer = Buffer.from(archive.data);
fs.writeFileSync(archivePath, archiveBuffer);
const allowedArtifactFiles = new Set([
"periphery.json",
"periphery.status",
"periphery.stderr.log",
"periphery.stdout.json",
"should-fail.txt",
]);
const maxEntries = allowedArtifactFiles.size;
const maxEntryBytes = 2 * 1024 * 1024;
const maxTotalBytes = 4 * 1024 * 1024;
const readUInt16 = (offset) => archiveBuffer.readUInt16LE(offset);
const readUInt32 = (offset) => archiveBuffer.readUInt32LE(offset);
const findEndOfCentralDirectoryOffset = () => {
const minimumOffset = Math.max(0, archiveBuffer.length - 0xffff - 22);
for (let offset = archiveBuffer.length - 22; offset >= minimumOffset; offset -= 1) {
if (readUInt32(offset) === 0x06054b50) {
return offset;
}
}
return -1;
};
const endOfCentralDirectoryOffset = findEndOfCentralDirectoryOffset();
if (endOfCentralDirectoryOffset < 0) {
core.warning(`Skipping ${artifactName}; ZIP end-of-central-directory record was not found.`);
return;
}
const entryCount = readUInt16(endOfCentralDirectoryOffset + 10);
const centralDirectorySize = readUInt32(endOfCentralDirectoryOffset + 12);
const centralDirectoryOffset = readUInt32(endOfCentralDirectoryOffset + 16);
if (entryCount < 1 || entryCount > maxEntries) {
core.warning(`Skipping ${artifactName}; artifact has ${entryCount} entries.`);
return;
}
if (
centralDirectoryOffset + centralDirectorySize > archiveBuffer.length ||
readUInt32(centralDirectoryOffset) !== 0x02014b50
) {
core.warning(`Skipping ${artifactName}; invalid ZIP central directory.`);
return;
}
const entries = new Map();
let totalUncompressedSize = 0;
let offset = centralDirectoryOffset;
for (let index = 0; index < entryCount; index += 1) {
if (offset + 46 > archiveBuffer.length || readUInt32(offset) !== 0x02014b50) {
core.warning(`Skipping ${artifactName}; invalid central directory entry.`);
return;
}
const compressionMethod = readUInt16(offset + 10);
const generalPurposeBitFlag = readUInt16(offset + 8);
const compressedSize = readUInt32(offset + 20);
const uncompressedSize = readUInt32(offset + 24);
const fileNameLength = readUInt16(offset + 28);
const extraLength = readUInt16(offset + 30);
const commentLength = readUInt16(offset + 32);
const externalAttributes = readUInt32(offset + 38);
const nameStart = offset + 46;
const nameEnd = nameStart + fileNameLength;
const nextOffset = nameEnd + extraLength + commentLength;
if (nextOffset > archiveBuffer.length) {
core.warning(`Skipping ${artifactName}; central directory entry exceeds archive bounds.`);
return;
}
const name = archiveBuffer.toString("utf8", nameStart, nameEnd);
const mode = externalAttributes >>> 16;
const fileType = mode & 0o170000;
const isRegularFile = fileType === 0 || fileType === 0o100000;
const invalidName =
!allowedArtifactFiles.has(name) ||
name.includes("/") ||
name.includes("\\") ||
name.includes("..") ||
path.isAbsolute(name);
if (invalidName) {
core.warning(`Skipping ${artifactName}; unexpected artifact entry ${name}.`);
return;
}
if (!isRegularFile || name.endsWith("/")) {
core.warning(`Skipping ${artifactName}; ${name} is not a regular file.`);
return;
}
if (entries.has(name)) {
core.warning(`Skipping ${artifactName}; duplicate artifact entry ${name}.`);
return;
}
if (![0, 8].includes(compressionMethod)) {
core.warning(`Skipping ${artifactName}; ${name} uses unsupported ZIP compression method ${compressionMethod}.`);
return;
}
if ((generalPurposeBitFlag & 0x1) !== 0) {
core.warning(`Skipping ${artifactName}; ${name} is encrypted.`);
return;
}
if (compressedSize > maxEntryBytes || uncompressedSize > maxEntryBytes) {
core.warning(`Skipping ${artifactName}; ${name} exceeds the per-file size limit.`);
return;
}
totalUncompressedSize += uncompressedSize;
if (totalUncompressedSize > maxTotalBytes) {
core.warning(`Skipping ${artifactName}; artifact exceeds the aggregate size limit.`);
return;
}
entries.set(name, { uncompressedSize });
offset = nextOffset;
}
const files = new Map();
for (const [name, entry] of entries) {
const contents = childProcess.execFileSync("unzip", ["-p", archivePath, name], {
encoding: "utf8",
maxBuffer: Math.max(1, entry.uncompressedSize + 1024),
timeout: 5000,
});
if (Buffer.byteLength(contents, "utf8") > maxEntryBytes) {
core.warning(`Skipping ${artifactName}; ${name} exceeded the per-file size limit while reading.`);
return;
}
files.set(name, contents);
}
const read = (name) => {
return files.get(name) ?? "";
};
const status = Number(read("periphery.status").trim() || "1");
let findings = null;
for (const name of ["periphery.json", "periphery.stdout.json"]) {
try {
const parsed = JSON.parse(read(name));
const validFindings =
Array.isArray(parsed) &&
parsed.every(
(finding) =>
finding !== null &&
typeof finding === "object" &&
!Array.isArray(finding),
);
if (validFindings) {
findings = parsed;
break;
}
} catch {}
}
return { findings, status };
};
const report = await readReport();
const status = report?.status ?? 1;
const findings = report?.findings ?? null;
const sanitizeCell = (value) => {
const normalized = String(value ?? "")
.replace(/[\u0000-\u001f\u007f-\u009f]/gu, " ")
.replace(/[\u200b-\u200f\u202a-\u202e\u2060\u2066-\u2069\ufeff]/gu, "")
.replace(/\s+/gu, " ")
.trim();
const maxEncodedLength = 180;
let escaped = "";
for (const character of normalized) {
const encoded =
character === "`"
? "'"
: character === "|"
? "\\|"
: character;
if (escaped.length + encoded.length > maxEncodedLength) {
break;
}
escaped += encoded;
}
return `\`${escaped || "-"}\``;
};
const rows = (findings ?? []).map((finding) => {
const location = String(finding.location ?? "");
const [file, line] = location.split(":");
return {
file: file ? `apps/ios/${file}` : "",
line: line || "",
kind: String(finding.kind ?? ""),
name: String(finding.name ?? ""),
};
});
let mode = "failure";
let body = `${marker}\n`;
if (scanSkipped) {
mode = "skipped";
body += [
"### iOS Periphery",
"",
"Periphery scan skipped because the pull request is a draft or no longer touches iOS scan scope.",
].join("\n");
} else if (findings === null) {
body += [
"### iOS Periphery",
"",
"Periphery did not complete or its report could not be safely read. Check the workflow run for details.",
].join("\n");
} else if (rows.length === 0 && status === 0) {
mode = "success";
body += [
"### iOS Periphery",
"",
"No dead Swift code found.",
].join("\n");
} else if (rows.length > 0) {
const shown = rows.slice(0, 50);
body += [
"### iOS Periphery",
"",
`Found ${rows.length} dead Swift code ${rows.length === 1 ? "symbol" : "symbols"}. Remove the code or add a narrow Periphery exemption with a comment explaining why it must stay.`,
"",
"| File | Line | Kind | Name |",
"| --- | ---: | --- | --- |",
...shown.map((row) => `| ${sanitizeCell(row.file)} | ${sanitizeCell(row.line)} | ${sanitizeCell(row.kind)} | ${sanitizeCell(row.name)} |`),
rows.length > shown.length ? "" : null,
rows.length > shown.length ? `Showing first ${shown.length}; full JSON is in the workflow artifact.` : null,
].filter(Boolean).join("\n");
} else {
body += [
"### iOS Periphery",
"",
"Periphery exited with a non-zero status before producing findings. Check the workflow artifact for stdout/stderr.",
].join("\n");
}
body += "\n";
const maxCommentChars = 60_000;
if (body.length > maxCommentChars) {
body = [
marker,
"### iOS Periphery",
"",
`Found ${rows.length} dead Swift code ${rows.length === 1 ? "symbol" : "symbols"}. The rendered report exceeded the safe comment limit; use the workflow artifact for details.`,
"",
].join("\n");
}
const comments = await github.paginate(github.rest.issues.listComments, {
owner,
repo,
issue_number: livePull.data.number,
per_page: 100,
});
const existing = comments.find(
(comment) =>
comment.user?.login === "github-actions[bot]" &&
comment.body?.includes(marker),
);
if (!existing && ["skipped", "success"].includes(mode)) {
core.info(`No existing Periphery comment and scan ${mode}; skipping comment.`);
return;
}
const currentPull = await github.rest.pulls.get({
owner,
repo,
pull_number: pr.number,
});
if (
currentPull.data.state !== "open" ||
currentPull.data.base?.repo?.full_name !== repository ||
currentPull.data.head?.sha !== run.head_sha
) {
core.info(`Skipping stale run ${run.id}; PR #${pr.number} changed before comment update.`);
return;
}
const workflowRuns = await github.paginate(github.rest.actions.listWorkflowRuns, {
owner,
repo,
workflow_id: run.workflow_id,
event: "pull_request",
head_sha: run.head_sha,
per_page: 100,
});
const supersedingRun = workflowRuns.find(
(candidate) =>
(candidate.id === run.id ||
candidate.pull_requests?.some(
(candidatePull) => candidatePull.number === pr.number,
)) &&
(candidate.run_number > run.run_number ||
(candidate.run_number === run.run_number &&
candidate.run_attempt > run.run_attempt)),
);
if (supersedingRun) {
core.info(`Skipping superseded run ${run.id} attempt ${run.run_attempt}; run ${supersedingRun.id} attempt ${supersedingRun.run_attempt} is newer.`);
return;
}
if (existing) {
await github.rest.issues.updateComment({
owner,
repo,
comment_id: existing.id,
body,
});
return;
}
await github.rest.issues.createComment({
owner,
repo,
issue_number: livePull.data.number,
body,
});

Some files were not shown because too many files have changed in this diff Show More