@1aboveio/skills 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +4 -4
  2. package/package.json +1 -1
  3. package/runtime/skills/distribution/generated/recipes.json +52 -32
  4. package/runtime/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +1 -1
  5. package/runtime/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +23 -1
  6. package/skills/cicd-pipeline/mergify/references/watch-contract.md +2 -2
  7. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +48 -4
  8. package/skills/data-science/airflow/SKILL.md +198 -0
  9. package/skills/data-science/pyspark/assets/templates/etl.py +1 -0
  10. package/skills/data-science/pyspark/references/etl-contract.md +3 -0
  11. package/skills/engineering/engineering-runtime/coherence/workflow.json +65 -15
  12. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +1 -1
  13. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +23 -1
  14. package/skills/engineering/resolve-issues/SKILL.md +1 -1
  15. package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +55 -11
  16. package/skills/engineering/resolve-issues/scripts/run-state.mjs +4 -4
  17. package/skills/engineering/resolve-release/SKILL.md +2 -1
  18. package/skills/engineering/resolve-release/agents/openai.yaml +9 -0
  19. package/skills/engineering/resolve-release/references/related-skills.md +1 -0
  20. package/skills/engineering/rush-issues/LICENSE +3 -0
  21. package/skills/engineering/rush-issues/SKILL.md +179 -0
  22. package/skills/engineering/rush-issues/agents/openai.yaml +9 -0
  23. package/skills/engineering/rush-issues/evals/evals.json +65 -0
  24. package/skills/engineering/rush-issues/references/canary.md +45 -0
  25. package/skills/engineering/rush-issues/references/cicd.md +37 -0
  26. package/skills/engineering/rush-issues/references/combine.md +51 -0
  27. package/skills/engineering/rush-issues/references/expire.md +55 -0
  28. package/skills/engineering/rush-issues/references/exploration.md +53 -0
  29. package/skills/engineering/rush-issues/references/implementation.md +66 -0
  30. package/skills/engineering/rush-issues/references/preflight.md +31 -0
  31. package/skills/engineering/rush-issues/references/profiling.md +78 -0
  32. package/skills/engineering/rush-issues/references/review.md +48 -0
  33. package/skills/engineering/rush-issues/references/shared-modules.md +66 -0
  34. package/skills/engineering/rush-issues/references/task-plan.md +110 -0
  35. package/skills/engineering/rush-issues/scripts/discover-models.mjs +9 -0
  36. package/skills/engineering/rush-issues/scripts/model-catalog.mjs +9 -0
  37. package/skills/engineering/rush-issues/scripts/preflight-models.mjs +466 -0
  38. package/skills/engineering/rush-release/LICENSE +3 -0
  39. package/skills/engineering/rush-release/SKILL.md +99 -0
  40. package/skills/engineering/rush-release/agents/openai.yaml +8 -0
  41. package/skills/engineering/rush-release/evals/evals.json +44 -0
  42. package/skills/engineering/rush-release/references/candidate.md +30 -0
  43. package/skills/engineering/rush-release/references/cut.md +66 -0
  44. package/skills/engineering/rush-release/references/preflight.md +47 -0
  45. package/skills/engineering/rush-release/references/publish.md +100 -0
  46. package/skills/engineering/rush-release/scripts/apply.mjs +185 -0
  47. package/skills/engineering/rush-release/scripts/green-head.mjs +231 -0
  48. package/skills/engineering/rush-release/scripts/plan.mjs +264 -0
  49. package/skills/fullstack/zod-v4/SKILL.md +1 -1
  50. package/skills/data-science/airflow-dag-develop/SKILL.md +0 -111
  51. /package/skills/data-science/{airflow-dag-develop → airflow}/LICENSE +0 -0
package/README.md CHANGED
@@ -65,10 +65,10 @@ planned same-named skill. The coordinator still owns group and new-member consen
65
65
 
66
66
  ## Groups in this package
67
67
 
68
- - `engineering-workflow` — Engineering Workflow: e2e-test, ensure-coverage, implement-and-pr, resolve-issues, resolve-release, review-pr, smoke, engineering-runtime
68
+ - `engineering-workflow` — Engineering Workflow: e2e-test, ensure-coverage, implement-and-pr, rush-issues, resolve-issues, rush-release, resolve-release, review-pr, smoke, engineering-runtime
69
69
  - `delivery-infrastructure` — Delivery Infrastructure: cloud-build, cloud-debug, cloud-deploy, docker, google-cloud, mergify, podman
70
70
  - `backend` — Backend: app-debug, python-backend
71
- - `data-science` — Data Science: airflow-dag-develop, pyspark
71
+ - `data-science` — Data Science: airflow, pyspark
72
72
  - `payment` — Payment: fraud-analysis, payment-analysis
73
73
  - `fullstack` — Fullstack: better-auth, monorepo, nextjs-fullstack, prisma-setup, shadcn, zod-v4
74
74
 
@@ -117,13 +117,13 @@ owns — copy the command for the group you want to remove:
117
117
 
118
118
  ```
119
119
  # Engineering Workflow
120
- npx skills@1.5.22 remove --global --agent universal claude-code --skill e2e-test ensure-coverage implement-and-pr resolve-issues resolve-release review-pr smoke engineering-runtime
120
+ npx skills@1.5.22 remove --global --agent universal claude-code --skill e2e-test ensure-coverage implement-and-pr rush-issues resolve-issues rush-release resolve-release review-pr smoke engineering-runtime
121
121
  # Delivery Infrastructure
122
122
  npx skills@1.5.22 remove --global --agent universal claude-code --skill cloud-build cloud-debug cloud-deploy docker google-cloud mergify podman
123
123
  # Backend
124
124
  npx skills@1.5.22 remove --global --agent universal claude-code --skill app-debug python-backend
125
125
  # Data Science
126
- npx skills@1.5.22 remove --global --agent universal claude-code --skill airflow-dag-develop pyspark
126
+ npx skills@1.5.22 remove --global --agent universal claude-code --skill airflow pyspark
127
127
  # Payment
128
128
  npx skills@1.5.22 remove --global --agent universal claude-code --skill fraud-analysis payment-analysis
129
129
  # Fullstack
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1aboveio/skills",
3
- "version": "0.17.0",
3
+ "version": "0.19.0",
4
4
  "description": "Install the 1AboveIO first-party skill groups through the native Skills CLI.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -8,7 +8,7 @@
8
8
  "id": "first-party",
9
9
  "type": "first-party",
10
10
  "package": "@1aboveio/skills",
11
- "version": "0.17.0",
11
+ "version": "0.19.0",
12
12
  "updatePolicy": "pinned-npm-version",
13
13
  "members": [
14
14
  {
@@ -29,12 +29,24 @@
29
29
  "role": "skill",
30
30
  "licenseResponsibility": "1aboveio-mit"
31
31
  },
32
+ {
33
+ "installName": "rush-issues",
34
+ "path": "skills/engineering/rush-issues",
35
+ "role": "skill",
36
+ "licenseResponsibility": "1aboveio-mit"
37
+ },
32
38
  {
33
39
  "installName": "resolve-issues",
34
40
  "path": "skills/engineering/resolve-issues",
35
41
  "role": "skill",
36
42
  "licenseResponsibility": "1aboveio-mit"
37
43
  },
44
+ {
45
+ "installName": "rush-release",
46
+ "path": "skills/engineering/rush-release",
47
+ "role": "skill",
48
+ "licenseResponsibility": "1aboveio-mit"
49
+ },
38
50
  {
39
51
  "installName": "resolve-release",
40
52
  "path": "skills/engineering/resolve-release",
@@ -114,8 +126,8 @@
114
126
  "licenseResponsibility": "1aboveio-mit"
115
127
  },
116
128
  {
117
- "installName": "airflow-dag-develop",
118
- "path": "skills/data-science/airflow-dag-develop",
129
+ "installName": "airflow",
130
+ "path": "skills/data-science/airflow",
119
131
  "role": "skill",
120
132
  "licenseResponsibility": "1aboveio-mit"
121
133
  },
@@ -196,14 +208,16 @@
196
208
  "sourceId": "first-party",
197
209
  "sourceType": "first-party",
198
210
  "package": "@1aboveio/skills",
199
- "version": "0.17.0",
211
+ "version": "0.19.0",
200
212
  "installPath": null,
201
213
  "members": [
202
214
  "harness-runtime",
203
215
  "e2e-test",
204
216
  "ensure-coverage",
205
217
  "implement-and-pr",
218
+ "rush-issues",
206
219
  "resolve-issues",
220
+ "rush-release",
207
221
  "resolve-release",
208
222
  "review-pr",
209
223
  "smoke",
@@ -212,7 +226,7 @@
212
226
  "commands": [
213
227
  {
214
228
  "transport": "local",
215
- "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage implement-and-pr resolve-issues resolve-release review-pr smoke engineering-runtime && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
229
+ "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage implement-and-pr rush-issues resolve-issues rush-release resolve-release review-pr smoke engineering-runtime && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
216
230
  }
217
231
  ],
218
232
  "onFailure": {
@@ -230,14 +244,16 @@
230
244
  "sourceId": "first-party",
231
245
  "sourceType": "first-party",
232
246
  "package": "@1aboveio/skills",
233
- "version": "0.17.0",
247
+ "version": "0.19.0",
234
248
  "installPath": null,
235
249
  "members": [
236
250
  "harness-runtime",
237
251
  "e2e-test",
238
252
  "ensure-coverage",
239
253
  "implement-and-pr",
254
+ "rush-issues",
240
255
  "resolve-issues",
256
+ "rush-release",
241
257
  "resolve-release",
242
258
  "review-pr",
243
259
  "smoke",
@@ -246,7 +262,7 @@
246
262
  "commands": [
247
263
  {
248
264
  "transport": "local",
249
- "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage implement-and-pr resolve-issues resolve-release review-pr smoke engineering-runtime && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
265
+ "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage implement-and-pr rush-issues resolve-issues rush-release resolve-release review-pr smoke engineering-runtime && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
250
266
  }
251
267
  ],
252
268
  "onFailure": {
@@ -257,7 +273,7 @@
257
273
  ]
258
274
  },
259
275
  "uninstall": {
260
- "command": "npx skills@1.5.22 remove --global --agent universal claude-code --skill e2e-test ensure-coverage implement-and-pr resolve-issues resolve-release review-pr smoke engineering-runtime",
276
+ "command": "npx skills@1.5.22 remove --global --agent universal claude-code --skill e2e-test ensure-coverage implement-and-pr rush-issues resolve-issues rush-release resolve-release review-pr smoke engineering-runtime",
261
277
  "removesDependencies": false
262
278
  }
263
279
  },
@@ -274,7 +290,7 @@
274
290
  "sourceId": "first-party",
275
291
  "sourceType": "first-party",
276
292
  "package": "@1aboveio/skills",
277
- "version": "0.17.0",
293
+ "version": "0.19.0",
278
294
  "installPath": null,
279
295
  "members": [
280
296
  "harness-runtime",
@@ -307,7 +323,7 @@
307
323
  "sourceId": "first-party",
308
324
  "sourceType": "first-party",
309
325
  "package": "@1aboveio/skills",
310
- "version": "0.17.0",
326
+ "version": "0.19.0",
311
327
  "installPath": null,
312
328
  "members": [
313
329
  "harness-runtime",
@@ -350,7 +366,7 @@
350
366
  "sourceId": "first-party",
351
367
  "sourceType": "first-party",
352
368
  "package": "@1aboveio/skills",
353
- "version": "0.17.0",
369
+ "version": "0.19.0",
354
370
  "installPath": null,
355
371
  "members": [
356
372
  "harness-runtime",
@@ -378,7 +394,7 @@
378
394
  "sourceId": "first-party",
379
395
  "sourceType": "first-party",
380
396
  "package": "@1aboveio/skills",
381
- "version": "0.17.0",
397
+ "version": "0.19.0",
382
398
  "installPath": null,
383
399
  "members": [
384
400
  "harness-runtime",
@@ -416,17 +432,17 @@
416
432
  "sourceId": "first-party",
417
433
  "sourceType": "first-party",
418
434
  "package": "@1aboveio/skills",
419
- "version": "0.17.0",
435
+ "version": "0.19.0",
420
436
  "installPath": null,
421
437
  "members": [
422
438
  "harness-runtime",
423
- "airflow-dag-develop",
439
+ "airflow",
424
440
  "pyspark"
425
441
  ],
426
442
  "commands": [
427
443
  {
428
444
  "transport": "local",
429
- "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime airflow-dag-develop pyspark"
445
+ "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime airflow pyspark"
430
446
  }
431
447
  ],
432
448
  "onFailure": {
@@ -444,17 +460,17 @@
444
460
  "sourceId": "first-party",
445
461
  "sourceType": "first-party",
446
462
  "package": "@1aboveio/skills",
447
- "version": "0.17.0",
463
+ "version": "0.19.0",
448
464
  "installPath": null,
449
465
  "members": [
450
466
  "harness-runtime",
451
- "airflow-dag-develop",
467
+ "airflow",
452
468
  "pyspark"
453
469
  ],
454
470
  "commands": [
455
471
  {
456
472
  "transport": "local",
457
- "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime airflow-dag-develop pyspark"
473
+ "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime airflow pyspark"
458
474
  }
459
475
  ],
460
476
  "onFailure": {
@@ -465,7 +481,7 @@
465
481
  ]
466
482
  },
467
483
  "uninstall": {
468
- "command": "npx skills@1.5.22 remove --global --agent universal claude-code --skill airflow-dag-develop pyspark",
484
+ "command": "npx skills@1.5.22 remove --global --agent universal claude-code --skill airflow pyspark",
469
485
  "removesDependencies": false
470
486
  }
471
487
  },
@@ -482,7 +498,7 @@
482
498
  "sourceId": "first-party",
483
499
  "sourceType": "first-party",
484
500
  "package": "@1aboveio/skills",
485
- "version": "0.17.0",
501
+ "version": "0.19.0",
486
502
  "installPath": null,
487
503
  "members": [
488
504
  "harness-runtime",
@@ -510,7 +526,7 @@
510
526
  "sourceId": "first-party",
511
527
  "sourceType": "first-party",
512
528
  "package": "@1aboveio/skills",
513
- "version": "0.17.0",
529
+ "version": "0.19.0",
514
530
  "installPath": null,
515
531
  "members": [
516
532
  "harness-runtime",
@@ -548,7 +564,7 @@
548
564
  "sourceId": "first-party",
549
565
  "sourceType": "first-party",
550
566
  "package": "@1aboveio/skills",
551
- "version": "0.17.0",
567
+ "version": "0.19.0",
552
568
  "installPath": null,
553
569
  "members": [
554
570
  "harness-runtime",
@@ -580,7 +596,7 @@
580
596
  "sourceId": "first-party",
581
597
  "sourceType": "first-party",
582
598
  "package": "@1aboveio/skills",
583
- "version": "0.17.0",
599
+ "version": "0.19.0",
584
600
  "installPath": null,
585
601
  "members": [
586
602
  "harness-runtime",
@@ -620,7 +636,7 @@
620
636
  "sourceId": "first-party",
621
637
  "sourceType": "first-party",
622
638
  "package": "@1aboveio/skills",
623
- "version": "0.17.0",
639
+ "version": "0.19.0",
624
640
  "installPath": null,
625
641
  "members": [
626
642
  "harness-runtime"
@@ -646,7 +662,7 @@
646
662
  "sourceId": "first-party",
647
663
  "sourceType": "first-party",
648
664
  "package": "@1aboveio/skills",
649
- "version": "0.17.0",
665
+ "version": "0.19.0",
650
666
  "installPath": null,
651
667
  "members": [
652
668
  "harness-runtime"
@@ -678,14 +694,16 @@
678
694
  "sourceId": "first-party",
679
695
  "sourceType": "first-party",
680
696
  "package": "@1aboveio/skills",
681
- "version": "0.17.0",
697
+ "version": "0.19.0",
682
698
  "installPath": null,
683
699
  "members": [
684
700
  "harness-runtime",
685
701
  "e2e-test",
686
702
  "ensure-coverage",
687
703
  "implement-and-pr",
704
+ "rush-issues",
688
705
  "resolve-issues",
706
+ "rush-release",
689
707
  "resolve-release",
690
708
  "review-pr",
691
709
  "smoke",
@@ -699,7 +717,7 @@
699
717
  "podman",
700
718
  "app-debug",
701
719
  "python-backend",
702
- "airflow-dag-develop",
720
+ "airflow",
703
721
  "pyspark",
704
722
  "fraud-analysis",
705
723
  "payment-analysis",
@@ -713,7 +731,7 @@
713
731
  "commands": [
714
732
  {
715
733
  "transport": "local",
716
- "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage implement-and-pr resolve-issues resolve-release review-pr smoke engineering-runtime cloud-build cloud-debug cloud-deploy docker google-cloud mergify podman app-debug python-backend airflow-dag-develop pyspark fraud-analysis payment-analysis better-auth monorepo nextjs-fullstack prisma-setup shadcn zod-v4 && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
734
+ "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage implement-and-pr rush-issues resolve-issues rush-release resolve-release review-pr smoke engineering-runtime cloud-build cloud-debug cloud-deploy docker google-cloud mergify podman app-debug python-backend airflow pyspark fraud-analysis payment-analysis better-auth monorepo nextjs-fullstack prisma-setup shadcn zod-v4 && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
717
735
  }
718
736
  ],
719
737
  "onFailure": {
@@ -731,14 +749,16 @@
731
749
  "sourceId": "first-party",
732
750
  "sourceType": "first-party",
733
751
  "package": "@1aboveio/skills",
734
- "version": "0.17.0",
752
+ "version": "0.19.0",
735
753
  "installPath": null,
736
754
  "members": [
737
755
  "harness-runtime",
738
756
  "e2e-test",
739
757
  "ensure-coverage",
740
758
  "implement-and-pr",
759
+ "rush-issues",
741
760
  "resolve-issues",
761
+ "rush-release",
742
762
  "resolve-release",
743
763
  "review-pr",
744
764
  "smoke",
@@ -752,7 +772,7 @@
752
772
  "podman",
753
773
  "app-debug",
754
774
  "python-backend",
755
- "airflow-dag-develop",
775
+ "airflow",
756
776
  "pyspark",
757
777
  "fraud-analysis",
758
778
  "payment-analysis",
@@ -766,7 +786,7 @@
766
786
  "commands": [
767
787
  {
768
788
  "transport": "local",
769
- "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage implement-and-pr resolve-issues resolve-release review-pr smoke engineering-runtime cloud-build cloud-debug cloud-deploy docker google-cloud mergify podman app-debug python-backend airflow-dag-develop pyspark fraud-analysis payment-analysis better-auth monorepo nextjs-fullstack prisma-setup shadcn zod-v4 && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
789
+ "command": "npx skills@1.5.22 add . --global --agent universal claude-code --skill harness-runtime e2e-test ensure-coverage implement-and-pr rush-issues resolve-issues rush-release resolve-release review-pr smoke engineering-runtime cloud-build cloud-debug cloud-deploy docker google-cloud mergify podman app-debug python-backend airflow pyspark fraud-analysis payment-analysis better-auth monorepo nextjs-fullstack prisma-setup shadcn zod-v4 && npm --prefix \"$(realpath \"$HOME/.agents/skills/engineering-runtime/scripts\")\" ci --ignore-scripts"
770
790
  }
771
791
  ],
772
792
  "onFailure": {
@@ -777,7 +797,7 @@
777
797
  ]
778
798
  },
779
799
  "uninstall": {
780
- "command": "npx skills@1.5.22 remove --global --agent universal claude-code --skill e2e-test ensure-coverage implement-and-pr resolve-issues resolve-release review-pr smoke engineering-runtime cloud-build cloud-debug cloud-deploy docker google-cloud mergify podman app-debug python-backend airflow-dag-develop pyspark fraud-analysis payment-analysis better-auth monorepo nextjs-fullstack prisma-setup shadcn zod-v4 harness-runtime"
800
+ "command": "npx skills@1.5.22 remove --global --agent universal claude-code --skill e2e-test ensure-coverage implement-and-pr rush-issues resolve-issues rush-release resolve-release review-pr smoke engineering-runtime cloud-build cloud-debug cloud-deploy docker google-cloud mergify podman app-debug python-backend airflow pyspark fraud-analysis payment-analysis better-auth monorepo nextjs-fullstack prisma-setup shadcn zod-v4 harness-runtime"
781
801
  }
782
802
  }
783
803
  }
@@ -288,7 +288,7 @@ function validateManifest(manifest) {
288
288
  add('digest-algorithm-invalid', 'engineering-runtime', 'The coherence digest algorithm is missing or unsupported.');
289
289
  }
290
290
  if (JSON.stringify(manifest.ownedMembers) !== JSON.stringify(WORKFLOW_OWNED_MEMBERS)) {
291
- add('owned-census-invalid', 'engineering-runtime', 'The exact eight-member Workflow ownership census is missing or malformed.');
291
+ add('owned-census-invalid', 'engineering-runtime', 'The exact ten-member Workflow ownership census is missing or malformed.');
292
292
  }
293
293
  if (JSON.stringify(manifest.dependencies) !== JSON.stringify([
294
294
  { groupId: 'matt-pocock-toolkit', members: MATT_DEPENDENCY_MEMBERS },
@@ -10,7 +10,9 @@ export const WORKFLOW_OWNED_MEMBERS = deepFreeze([
10
10
  'e2e-test',
11
11
  'ensure-coverage',
12
12
  'implement-and-pr',
13
+ 'rush-issues',
13
14
  'resolve-issues',
15
+ 'rush-release',
14
16
  'resolve-release',
15
17
  'review-pr',
16
18
  'smoke',
@@ -52,6 +54,18 @@ export const WORKFLOW_TRUSTED_INVOCATION_POLICIES = deepFreeze([
52
54
  ]);
53
55
 
54
56
  export const WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES = deepFreeze([
57
+ {
58
+ invokedSkill: 'rush-issues',
59
+ members: [
60
+ 'code-review',
61
+ 'harness-runtime',
62
+ 'e2e-test',
63
+ 'rush-issues',
64
+ 'smoke',
65
+ 'engineering-runtime',
66
+ ],
67
+ generatedIdentities: [],
68
+ },
55
69
  {
56
70
  invokedSkill: 'resolve-issues',
57
71
  members: [
@@ -69,6 +83,14 @@ export const WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES = deepFreeze([
69
83
  { member: 'resolve-issues', path: 'generated/workflow-repair-policy.json' },
70
84
  ],
71
85
  },
86
+ {
87
+ invokedSkill: 'rush-release',
88
+ members: [
89
+ 'rush-release',
90
+ 'engineering-runtime',
91
+ ],
92
+ generatedIdentities: [],
93
+ },
72
94
  {
73
95
  invokedSkill: 'resolve-release',
74
96
  members: [
@@ -97,7 +119,7 @@ export const WORKFLOW_TRUSTED_SOURCES = deepFreeze({
97
119
  id: 'first-party',
98
120
  type: 'first-party',
99
121
  package: '@1aboveio/skills',
100
- version: '0.17.0',
122
+ version: '0.19.0',
101
123
  },
102
124
  matt: {
103
125
  id: 'matt-pocock',
@@ -24,7 +24,7 @@ So the watcher's memory *is* the verdict. Four pieces of state must survive acro
24
24
 
25
25
  1. **`seenQueued`** — has queue entry ever been observed? Every downstream transition depends on it. Set from the `queued` label **or** `mergify queue show`.
26
26
  2. **A re-read counter** (`missingActiveReads` / `absentStreak`) — one absence is suspicion, two consecutive *readable* absences settle `DEQUEUED`.
27
- 3. **Readable vs. absent** — a failed `gh`/`mergify` call is *no information* and must not advance that counter.
27
+ 3. **Readable vs. absent** — a failed `gh`/`mergify` call is *no information*: it must not advance that counter or overwrite that source's last readable contribution to the stall-state snapshot. During a partial outage, the still-readable sibling remains informative and genuine progress from it still resets the change clock.
28
28
  4. **A change clock** (`lastChangeMs`) — the stall bound is *no observable change*, not elapsed time.
29
29
 
30
30
  ### Why a per-poll predicate cannot satisfy this
@@ -160,7 +160,7 @@ When the reason is not machine-readable, quote the Mergify status comment, queue
160
160
  ## Watcher Requirements
161
161
 
162
162
  - Run as one background task or one script invocation; do not spend foreground turns polling.
163
- - Retry transient `gh`, GraphQL, and Mergify CLI failures. EOF, TLS handshake timeouts, and temporary API failures are not dequeue signals — an unreadable read is *no information*, not a "not queued" observation, and must not advance the counter that settles `DEQUEUED`.
163
+ - Retry transient `gh`, GraphQL, and Mergify CLI failures. EOF, TLS handshake timeouts, and temporary API failures are not dequeue signals — an unreadable read is *no information*, not a "not queued" observation, and must not advance the counter that settles `DEQUEUED`. Retain that source's last readable stall-state contribution instead; a readable sibling can still report genuine progress and reset the change clock.
164
164
  - Bound every subprocess read on its own timeout, in addition to the stall/ceiling bounds below — those are only evaluated after a poll returns, so an unbounded read can hang the watcher past both of them.
165
165
  - **Run the bundled script. Do not hand-roll a watcher** — see the progression section above for why the hand-rolled shape cannot hold the contract, whatever care goes into the code. (If you are reading a legacy shell watcher: avoid shell-reserved variable names such as `status`.)
166
166
  - Keep enqueue and watch separate. A watch observes only; it does not post `@mergifyio queue`, `@mergifyio dequeue`, or merge.
@@ -165,6 +165,50 @@ export function observationKey({ pr = {}, queue = {} } = {}) {
165
165
  ])
166
166
  }
167
167
 
168
+ function stallPrSnapshot(pr = {}) {
169
+ return {
170
+ state: pr.state ?? null,
171
+ mergedAt: pr.mergedAt ?? null,
172
+ headRefOid: pr.headRefOid ?? null,
173
+ labels: Array.isArray(pr.labels) ? [...pr.labels] : [],
174
+ failedChecks: Array.isArray(pr.failedChecks) ? pr.failedChecks.map(({ name, status }) => ({ name, status })) : [],
175
+ pendingChecks: Array.isArray(pr.pendingChecks) ? pr.pendingChecks.map(({ name, status }) => ({ name, status })) : [],
176
+ }
177
+ }
178
+
179
+ function stallQueueSnapshot(queue = {}) {
180
+ return {
181
+ queued: queue.queued ?? null,
182
+ queueState: queue.queueState ?? queue.state ?? null,
183
+ position: queue.position ?? null,
184
+ }
185
+ }
186
+
187
+ // Retain each source's last readable contribution independently. A failed read carries no
188
+ // replacement state, while a readable sibling can still move the effective stall snapshot.
189
+ export function nextStallObservation({ cache = {}, pr = {}, queue = {} } = {}) {
190
+ const previous = cache && typeof cache === 'object' ? cache : {}
191
+ const prReadable = pr.readable !== false
192
+ const queueReadable = queue.readable !== false
193
+ const nextPr = prReadable ? stallPrSnapshot(pr) : (previous.pr ?? null)
194
+ const nextQueue = queueReadable ? stallQueueSnapshot(queue) : (previous.queue ?? null)
195
+
196
+ if (!prReadable && !queueReadable) {
197
+ return {
198
+ cache: { pr: nextPr, queue: nextQueue, key: previous.key ?? null },
199
+ key: previous.key ?? null,
200
+ changed: false,
201
+ }
202
+ }
203
+
204
+ const key = observationKey({ pr: nextPr ?? {}, queue: nextQueue ?? {} })
205
+ return {
206
+ cache: { pr: nextPr, queue: nextQueue, key },
207
+ key,
208
+ changed: key !== (previous.key ?? null),
209
+ }
210
+ }
211
+
168
212
  // A failed subprocess read (`readable: false`) carries no information about queue membership
169
213
  // — it is not evidence the PR is still queued, and it is not evidence it left the queue
170
214
  // either. Only a clean read that reports absence should move the counter that eventually
@@ -609,7 +653,7 @@ export async function runCli(argv) {
609
653
  let seenQueued = args.seenQueued === true
610
654
  let everActive = false
611
655
  let missingActiveReads = 0
612
- let lastKey = null
656
+ let stallObservationCache = null
613
657
  let lastChangeMs = startedMs
614
658
  let observations = 0
615
659
  let phases = []
@@ -675,10 +719,10 @@ export async function runCli(argv) {
675
719
  return verdict.outcome === 'MERGED' ? 0 : 4
676
720
  }
677
721
 
678
- const key = observationKey({ pr, queue })
679
- const changed = key !== lastKey
722
+ const stallObservation = nextStallObservation({ cache: stallObservationCache, pr, queue })
723
+ stallObservationCache = stallObservation.cache
724
+ const changed = stallObservation.changed
680
725
  if (changed) {
681
- lastKey = key
682
726
  lastChangeMs = Date.now()
683
727
  }
684
728