@1aboveio/skills 0.16.1 → 0.17.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.
- package/package.json +1 -1
- package/runtime/skills/distribution/generated/recipes.json +17 -17
- package/runtime/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +1 -1
- package/skills/data-science/pyspark/SKILL.md +13 -5
- package/skills/data-science/pyspark/assets/templates/etl.py +51 -0
- package/skills/data-science/pyspark/references/diagnosis-and-profiling.md +17 -8
- package/skills/data-science/pyspark/references/etl-contract.md +19 -0
- package/skills/data-science/pyspark/references/production-validation.md +3 -2
- package/skills/engineering/engineering-runtime/coherence/workflow.json +14 -14
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +1 -1
- package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +11 -11
- package/skills/engineering/resolve-issues/scripts/run-state.mjs +1 -1
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"id": "first-party",
|
|
9
9
|
"type": "first-party",
|
|
10
10
|
"package": "@1aboveio/skills",
|
|
11
|
-
"version": "0.
|
|
11
|
+
"version": "0.17.0",
|
|
12
12
|
"updatePolicy": "pinned-npm-version",
|
|
13
13
|
"members": [
|
|
14
14
|
{
|
|
@@ -196,7 +196,7 @@
|
|
|
196
196
|
"sourceId": "first-party",
|
|
197
197
|
"sourceType": "first-party",
|
|
198
198
|
"package": "@1aboveio/skills",
|
|
199
|
-
"version": "0.
|
|
199
|
+
"version": "0.17.0",
|
|
200
200
|
"installPath": null,
|
|
201
201
|
"members": [
|
|
202
202
|
"harness-runtime",
|
|
@@ -230,7 +230,7 @@
|
|
|
230
230
|
"sourceId": "first-party",
|
|
231
231
|
"sourceType": "first-party",
|
|
232
232
|
"package": "@1aboveio/skills",
|
|
233
|
-
"version": "0.
|
|
233
|
+
"version": "0.17.0",
|
|
234
234
|
"installPath": null,
|
|
235
235
|
"members": [
|
|
236
236
|
"harness-runtime",
|
|
@@ -274,7 +274,7 @@
|
|
|
274
274
|
"sourceId": "first-party",
|
|
275
275
|
"sourceType": "first-party",
|
|
276
276
|
"package": "@1aboveio/skills",
|
|
277
|
-
"version": "0.
|
|
277
|
+
"version": "0.17.0",
|
|
278
278
|
"installPath": null,
|
|
279
279
|
"members": [
|
|
280
280
|
"harness-runtime",
|
|
@@ -307,7 +307,7 @@
|
|
|
307
307
|
"sourceId": "first-party",
|
|
308
308
|
"sourceType": "first-party",
|
|
309
309
|
"package": "@1aboveio/skills",
|
|
310
|
-
"version": "0.
|
|
310
|
+
"version": "0.17.0",
|
|
311
311
|
"installPath": null,
|
|
312
312
|
"members": [
|
|
313
313
|
"harness-runtime",
|
|
@@ -350,7 +350,7 @@
|
|
|
350
350
|
"sourceId": "first-party",
|
|
351
351
|
"sourceType": "first-party",
|
|
352
352
|
"package": "@1aboveio/skills",
|
|
353
|
-
"version": "0.
|
|
353
|
+
"version": "0.17.0",
|
|
354
354
|
"installPath": null,
|
|
355
355
|
"members": [
|
|
356
356
|
"harness-runtime",
|
|
@@ -378,7 +378,7 @@
|
|
|
378
378
|
"sourceId": "first-party",
|
|
379
379
|
"sourceType": "first-party",
|
|
380
380
|
"package": "@1aboveio/skills",
|
|
381
|
-
"version": "0.
|
|
381
|
+
"version": "0.17.0",
|
|
382
382
|
"installPath": null,
|
|
383
383
|
"members": [
|
|
384
384
|
"harness-runtime",
|
|
@@ -416,7 +416,7 @@
|
|
|
416
416
|
"sourceId": "first-party",
|
|
417
417
|
"sourceType": "first-party",
|
|
418
418
|
"package": "@1aboveio/skills",
|
|
419
|
-
"version": "0.
|
|
419
|
+
"version": "0.17.0",
|
|
420
420
|
"installPath": null,
|
|
421
421
|
"members": [
|
|
422
422
|
"harness-runtime",
|
|
@@ -444,7 +444,7 @@
|
|
|
444
444
|
"sourceId": "first-party",
|
|
445
445
|
"sourceType": "first-party",
|
|
446
446
|
"package": "@1aboveio/skills",
|
|
447
|
-
"version": "0.
|
|
447
|
+
"version": "0.17.0",
|
|
448
448
|
"installPath": null,
|
|
449
449
|
"members": [
|
|
450
450
|
"harness-runtime",
|
|
@@ -482,7 +482,7 @@
|
|
|
482
482
|
"sourceId": "first-party",
|
|
483
483
|
"sourceType": "first-party",
|
|
484
484
|
"package": "@1aboveio/skills",
|
|
485
|
-
"version": "0.
|
|
485
|
+
"version": "0.17.0",
|
|
486
486
|
"installPath": null,
|
|
487
487
|
"members": [
|
|
488
488
|
"harness-runtime",
|
|
@@ -510,7 +510,7 @@
|
|
|
510
510
|
"sourceId": "first-party",
|
|
511
511
|
"sourceType": "first-party",
|
|
512
512
|
"package": "@1aboveio/skills",
|
|
513
|
-
"version": "0.
|
|
513
|
+
"version": "0.17.0",
|
|
514
514
|
"installPath": null,
|
|
515
515
|
"members": [
|
|
516
516
|
"harness-runtime",
|
|
@@ -548,7 +548,7 @@
|
|
|
548
548
|
"sourceId": "first-party",
|
|
549
549
|
"sourceType": "first-party",
|
|
550
550
|
"package": "@1aboveio/skills",
|
|
551
|
-
"version": "0.
|
|
551
|
+
"version": "0.17.0",
|
|
552
552
|
"installPath": null,
|
|
553
553
|
"members": [
|
|
554
554
|
"harness-runtime",
|
|
@@ -580,7 +580,7 @@
|
|
|
580
580
|
"sourceId": "first-party",
|
|
581
581
|
"sourceType": "first-party",
|
|
582
582
|
"package": "@1aboveio/skills",
|
|
583
|
-
"version": "0.
|
|
583
|
+
"version": "0.17.0",
|
|
584
584
|
"installPath": null,
|
|
585
585
|
"members": [
|
|
586
586
|
"harness-runtime",
|
|
@@ -620,7 +620,7 @@
|
|
|
620
620
|
"sourceId": "first-party",
|
|
621
621
|
"sourceType": "first-party",
|
|
622
622
|
"package": "@1aboveio/skills",
|
|
623
|
-
"version": "0.
|
|
623
|
+
"version": "0.17.0",
|
|
624
624
|
"installPath": null,
|
|
625
625
|
"members": [
|
|
626
626
|
"harness-runtime"
|
|
@@ -646,7 +646,7 @@
|
|
|
646
646
|
"sourceId": "first-party",
|
|
647
647
|
"sourceType": "first-party",
|
|
648
648
|
"package": "@1aboveio/skills",
|
|
649
|
-
"version": "0.
|
|
649
|
+
"version": "0.17.0",
|
|
650
650
|
"installPath": null,
|
|
651
651
|
"members": [
|
|
652
652
|
"harness-runtime"
|
|
@@ -678,7 +678,7 @@
|
|
|
678
678
|
"sourceId": "first-party",
|
|
679
679
|
"sourceType": "first-party",
|
|
680
680
|
"package": "@1aboveio/skills",
|
|
681
|
-
"version": "0.
|
|
681
|
+
"version": "0.17.0",
|
|
682
682
|
"installPath": null,
|
|
683
683
|
"members": [
|
|
684
684
|
"harness-runtime",
|
|
@@ -731,7 +731,7 @@
|
|
|
731
731
|
"sourceId": "first-party",
|
|
732
732
|
"sourceType": "first-party",
|
|
733
733
|
"package": "@1aboveio/skills",
|
|
734
|
-
"version": "0.
|
|
734
|
+
"version": "0.17.0",
|
|
735
735
|
"installPath": null,
|
|
736
736
|
"members": [
|
|
737
737
|
"harness-runtime",
|
|
@@ -5,7 +5,8 @@ description: >
|
|
|
5
5
|
ETL pipelines, feature calculations, and Hudi/warehouse writes. Follow
|
|
6
6
|
contract → transform → materialize → local test → production validation
|
|
7
7
|
(one-month canary, optional profile if that canary exceeds 5 minutes without
|
|
8
|
-
resource constraints, authorized write, cluster
|
|
8
|
+
resource constraints or any job exceeds 30 minutes, authorized write, cluster
|
|
9
|
+
reconciliation). Use whenever
|
|
9
10
|
the task involves Spark DataFrames or Spark SQL, joins, windows, grouped
|
|
10
11
|
state, UDFs, shuffle, skew, spill, slow stages, driver/executor OOM, Spark
|
|
11
12
|
Connect, spark-submit, Hudi commits, backfills, validate-only canaries,
|
|
@@ -69,6 +70,11 @@ windows or FIFO paths, also read
|
|
|
69
70
|
Spark may recompute the candidate.
|
|
70
71
|
- Keep the validate-only guard inside the job and before every writer. Do not
|
|
71
72
|
add `.count()`, `.cache()`, or `.persist()` to warm execution.
|
|
73
|
+
- Do not set Spark or Hudi shuffle parallelism (`spark.sql.shuffle.partitions`,
|
|
74
|
+
`hoodie.*.shuffle.parallelism`). Those knobs split the write into many tiny
|
|
75
|
+
files. Leave Spark/Hudi defaults; size writes with `HudiLayout`. Repair an
|
|
76
|
+
existing small-file table with `Etl.rewrite_hudi_layout` (see
|
|
77
|
+
[ETL Contract](references/etl-contract.md)).
|
|
72
78
|
|
|
73
79
|
### 4. Test
|
|
74
80
|
|
|
@@ -86,10 +92,12 @@ typically **one month** of source data. Local tests do not substitute.
|
|
|
86
92
|
1. **Canary:** `spark-submit` with `--validate-only` on that sample and the
|
|
87
93
|
production runtime. Require zero blockers, an explicit publication skip,
|
|
88
94
|
zero Spark output records/bytes, and readable driver/event logs.
|
|
89
|
-
2. **Profiling (optional):**
|
|
90
|
-
time exceeds **5 minutes** **and** the run was not
|
|
91
|
-
(queued, under-provisioned executors, competing
|
|
92
|
-
|
|
95
|
+
2. **Profiling (optional):** required when **either** (a) the small-sample
|
|
96
|
+
canary wall time exceeds **5 minutes** **and** the run was not
|
|
97
|
+
resource-constrained (queued, under-provisioned executors, competing
|
|
98
|
+
warehouse work), **or** (b) **any** job (canary, write, or scheduled run)
|
|
99
|
+
exceeds **30 minutes** — a hard gate, even if the cluster was constrained.
|
|
100
|
+
Otherwise skip. When required, follow
|
|
93
101
|
[Diagnosis And Profiling](references/diagnosis-and-profiling.md).
|
|
94
102
|
3. **Write (authorized):** re-check admission, then publish the same pinned
|
|
95
103
|
sample. Do not present canary time as write performance.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from abc import ABC, abstractmethod
|
|
2
2
|
from argparse import ArgumentParser
|
|
3
3
|
from contextlib import contextmanager
|
|
4
|
+
from dataclasses import dataclass
|
|
4
5
|
import enum
|
|
5
6
|
import logging
|
|
6
7
|
import os
|
|
@@ -22,6 +23,25 @@ from utils.hudi_metadata import hudi_metadata_write_options
|
|
|
22
23
|
logger = logging.getLogger(__name__)
|
|
23
24
|
|
|
24
25
|
|
|
26
|
+
@dataclass(frozen=True)
|
|
27
|
+
class HudiLayout:
|
|
28
|
+
"""Target on-disk layout. Do not pair with Spark/Hudi shuffle parallelism."""
|
|
29
|
+
|
|
30
|
+
files_per_partition: int = 1
|
|
31
|
+
target_file_size_mb: int = 128
|
|
32
|
+
|
|
33
|
+
def write_options(self) -> Dict[str, Union[str, int]]:
|
|
34
|
+
target_bytes = int(self.target_file_size_mb) * 1024 * 1024
|
|
35
|
+
group_bytes = target_bytes * max(1, int(self.files_per_partition))
|
|
36
|
+
return {
|
|
37
|
+
"hoodie.parquet.max.file.size": str(target_bytes),
|
|
38
|
+
"hoodie.parquet.small.file.limit": str(target_bytes),
|
|
39
|
+
"hoodie.copyonwrite.insert.split.size": str(target_bytes),
|
|
40
|
+
"hoodie.clustering.plan.strategy.target.file.max.bytes": str(target_bytes),
|
|
41
|
+
"hoodie.clustering.plan.strategy.max.bytes.per.group": str(group_bytes),
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
25
45
|
_SPARK_LEASE_LOCK = threading.RLock()
|
|
26
46
|
_SPARK_LEASES = {}
|
|
27
47
|
|
|
@@ -157,6 +177,10 @@ class Etl(ABC):
|
|
|
157
177
|
"SINGLE_WRITER"
|
|
158
178
|
)
|
|
159
179
|
extra_hudi_options: Dict[str, Union[str, bool, int]] = {}
|
|
180
|
+
hudi_layout = HudiLayout(
|
|
181
|
+
files_per_partition=1,
|
|
182
|
+
target_file_size_mb=128,
|
|
183
|
+
)
|
|
160
184
|
zookeeper: str = None
|
|
161
185
|
|
|
162
186
|
def __init__(
|
|
@@ -321,6 +345,8 @@ class Etl(ABC):
|
|
|
321
345
|
"hoodie.datasource.write.precombine.field": self.ts,
|
|
322
346
|
"hoodie.datasource.write.operation": f"{operation}",
|
|
323
347
|
"hoodie.datasource.write.reconcile.schema": True,
|
|
348
|
+
# Do not set hoodie.*.shuffle.parallelism or spark.sql.shuffle.partitions:
|
|
349
|
+
# each shuffle task becomes a tiny Hudi file.
|
|
324
350
|
"hoodie.schema.on.read.enable": True,
|
|
325
351
|
# ---------------------------------------------------------------
|
|
326
352
|
# Hudi 0.15 ComplexKeyGenerator regression fix
|
|
@@ -350,6 +376,7 @@ class Etl(ABC):
|
|
|
350
376
|
"path": self.path,
|
|
351
377
|
}
|
|
352
378
|
hudi_options.update(self.extra_hudi_options)
|
|
379
|
+
hudi_options.update(self.hudi_layout.write_options())
|
|
353
380
|
# Applied last, deliberately. A table inside the daily v3 metadata
|
|
354
381
|
# listing scope must have its Hudi metadata index maintained by every
|
|
355
382
|
# writer; an `extra_hudi_options` opt-out would leave the index stale
|
|
@@ -361,6 +388,30 @@ class Etl(ABC):
|
|
|
361
388
|
|
|
362
389
|
df.write.format("hudi").options(**hudi_options).mode("append").save()
|
|
363
390
|
|
|
391
|
+
def rewrite_hudi_layout(self, partition_filter: Optional[str] = None) -> None:
|
|
392
|
+
"""Repair small files on an existing Hudi table.
|
|
393
|
+
|
|
394
|
+
Reads the published path, drops `_hoodie_*` meta columns, and
|
|
395
|
+
``insert_overwrite``s with ``HudiLayout``. Do not set Spark/Hudi
|
|
396
|
+
shuffle parallelism. Pass a Spark SQL predicate to limit the rewrite
|
|
397
|
+
(for example ``dt = '2026-08-01'``).
|
|
398
|
+
"""
|
|
399
|
+
if self.table_type != "hudi_table":
|
|
400
|
+
raise ValueError("rewrite_hudi_layout is for hudi_table only")
|
|
401
|
+
if not self._is_existing_hudi_table():
|
|
402
|
+
raise ValueError(f"no Hudi table at {self.path}")
|
|
403
|
+
source = self.spark.read.format("hudi").load(self.path)
|
|
404
|
+
if partition_filter:
|
|
405
|
+
source = source.where(partition_filter)
|
|
406
|
+
meta = [c for c in source.columns if c.startswith("_hoodie_")]
|
|
407
|
+
source = source.drop(*meta) if meta else source
|
|
408
|
+
previous = self.hudi_mode
|
|
409
|
+
try:
|
|
410
|
+
self.hudi_mode = "insert_overwrite"
|
|
411
|
+
self.load_hudi(source)
|
|
412
|
+
finally:
|
|
413
|
+
self.hudi_mode = previous
|
|
414
|
+
|
|
364
415
|
def load_spark(self, df: DataFrame):
|
|
365
416
|
output = df.repartition(*self.repartition) if self.repartition else df
|
|
366
417
|
try:
|
|
@@ -7,12 +7,19 @@ commands from the available runtime.
|
|
|
7
7
|
|
|
8
8
|
## When Profiling Is Required
|
|
9
9
|
|
|
10
|
-
Profiling is optional during production validation. It is **required**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
Profiling is optional during production validation. It is **required** when
|
|
11
|
+
**either**:
|
|
12
|
+
|
|
13
|
+
1. The small-sample canary (typically one month) wall time exceeds **5 minutes**
|
|
14
|
+
**and** the run was **not** resource-constrained (queued, under-provisioned
|
|
15
|
+
executors, competing warehouse work).
|
|
16
|
+
2. **Any** job — canary, authorized write, or a scheduled production run —
|
|
17
|
+
exceeds **30 minutes**. This is a hard gate. Resource contention does not
|
|
18
|
+
waive it.
|
|
19
|
+
|
|
20
|
+
Otherwise skip. When required, parse the event log and compare an isolated
|
|
21
|
+
baseline on the same sample and resource profile. Keep validate-only time
|
|
22
|
+
separate from write time.
|
|
16
23
|
|
|
17
24
|
```bash
|
|
18
25
|
set -o pipefail
|
|
@@ -65,7 +72,9 @@ Apply these rules to every performance change:
|
|
|
65
72
|
hot-key algorithms, and write amplification in the job logic or data layout.
|
|
66
73
|
- Do not claim a performance fix from changing shuffle partitions, executor
|
|
67
74
|
count/cores/memory, timeouts, broadcast thresholds or hints, AQE switches,
|
|
68
|
-
repartition counts, cache/persistence, or retry settings.
|
|
75
|
+
repartition counts, cache/persistence, or retry settings. Raising Spark or
|
|
76
|
+
Hudi shuffle parallelism also creates small files on the write path; leave
|
|
77
|
+
those settings unset.
|
|
69
78
|
- Do not meet the target by dropping history, rows, columns, validations,
|
|
70
79
|
formulas, or publication work required by the job.
|
|
71
80
|
- Classify a proven cluster, storage, or configuration defect as an operational
|
|
@@ -133,7 +142,7 @@ settings merely because the slow work becomes visible at a later action.
|
|
|
133
142
|
intended physical-plan change with focused tests. Do not treat local Spark as
|
|
134
143
|
cluster parity.
|
|
135
144
|
5. **Production validation:** one-month (typical) sample: canary, optional
|
|
136
|
-
profile (
|
|
145
|
+
profile (5-minute unconstrained canary **or** any job over 30 minutes),
|
|
137
146
|
authorized write, then reconciliation.
|
|
138
147
|
|
|
139
148
|
Repeat the loop when the target is still missed or the dominant gap moves.
|
|
@@ -93,6 +93,25 @@ belong before the writer in the job process.
|
|
|
93
93
|
- Reject incremental mode without a filter/watermark and exact restart boundary.
|
|
94
94
|
- Reject optimistic concurrency without a working lock provider.
|
|
95
95
|
- Do not rely on scheduler timing as the single-writer guarantee.
|
|
96
|
+
- Do not set `spark.sql.shuffle.partitions` or Hudi
|
|
97
|
+
`hoodie.insert.shuffle.parallelism` / `hoodie.upsert.shuffle.parallelism` /
|
|
98
|
+
`hoodie.bulkinsert.shuffle.parallelism`. A raised shuffle partition count
|
|
99
|
+
becomes one small file per task on the write path. Size files with
|
|
100
|
+
`HudiLayout` (default one ~128MB file per partition), not shuffle parallelism.
|
|
101
|
+
|
|
102
|
+
### Repair small files
|
|
103
|
+
|
|
104
|
+
Existing tables written with high shuffle parallelism stay small-file until
|
|
105
|
+
rewritten. Use `Etl.rewrite_hudi_layout` (same keys, partitions, locks, and
|
|
106
|
+
`HudiLayout`). Restrict with a partition predicate when the table is large.
|
|
107
|
+
Do not set shuffle parallelism on the rewrite either.
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
job = MyEtl(start_date="2026-08-01", end_date="2026-08-02")
|
|
111
|
+
job.rewrite_hudi_layout("dt = '2026-08-01'") # one partition
|
|
112
|
+
# job.rewrite_hudi_layout() # whole table
|
|
113
|
+
```
|
|
114
|
+
|
|
96
115
|
- Do not present `repartition`, JDBC partition count, fetch size, or writer
|
|
97
116
|
option changes as logic optimization; classify required configuration fixes
|
|
98
117
|
as separate operational work.
|
|
@@ -102,8 +102,9 @@ Do not add `.cache()` or `.persist()` to warm the canary.
|
|
|
102
102
|
|
|
103
103
|
## 2. Profiling (optional)
|
|
104
104
|
|
|
105
|
-
After the canary, profile
|
|
106
|
-
|
|
105
|
+
After the canary, profile when **either** the small-sample canary exceeds
|
|
106
|
+
**5 minutes** without resource constraints, **or any job exceeds 30 minutes**
|
|
107
|
+
(hard gate). Otherwise skip. When required, follow
|
|
107
108
|
[Diagnosis And Profiling](diagnosis-and-profiling.md).
|
|
108
109
|
|
|
109
110
|
## 3. Write
|
|
@@ -361,7 +361,7 @@
|
|
|
361
361
|
"id": "first-party",
|
|
362
362
|
"type": "first-party",
|
|
363
363
|
"package": "@1aboveio/skills",
|
|
364
|
-
"version": "0.
|
|
364
|
+
"version": "0.17.0"
|
|
365
365
|
},
|
|
366
366
|
"contentDigest": "eff6c7b5931bce5b2265a619bccddd371a89df6ce7bc2edc74f11d00060a71dd",
|
|
367
367
|
"digestExcludes": []
|
|
@@ -374,7 +374,7 @@
|
|
|
374
374
|
"id": "first-party",
|
|
375
375
|
"type": "first-party",
|
|
376
376
|
"package": "@1aboveio/skills",
|
|
377
|
-
"version": "0.
|
|
377
|
+
"version": "0.17.0"
|
|
378
378
|
},
|
|
379
379
|
"contentDigest": "08230dc57a53d6526692b50138038abbd80abce1a067e01c52ad6acc182caf7e",
|
|
380
380
|
"digestExcludes": []
|
|
@@ -387,7 +387,7 @@
|
|
|
387
387
|
"id": "first-party",
|
|
388
388
|
"type": "first-party",
|
|
389
389
|
"package": "@1aboveio/skills",
|
|
390
|
-
"version": "0.
|
|
390
|
+
"version": "0.17.0"
|
|
391
391
|
},
|
|
392
392
|
"contentDigest": "9eea7bfba348ddaea1b934c9a7fabdd9b101df8a146e1c93e947da4d335f1d98",
|
|
393
393
|
"digestExcludes": []
|
|
@@ -400,7 +400,7 @@
|
|
|
400
400
|
"id": "first-party",
|
|
401
401
|
"type": "first-party",
|
|
402
402
|
"package": "@1aboveio/skills",
|
|
403
|
-
"version": "0.
|
|
403
|
+
"version": "0.17.0"
|
|
404
404
|
},
|
|
405
405
|
"contentDigest": "58b0556228a9271cf9e33727a05fc08a4fdfd29512ec0936b169f0a55d60e6ef",
|
|
406
406
|
"digestExcludes": []
|
|
@@ -413,9 +413,9 @@
|
|
|
413
413
|
"id": "first-party",
|
|
414
414
|
"type": "first-party",
|
|
415
415
|
"package": "@1aboveio/skills",
|
|
416
|
-
"version": "0.
|
|
416
|
+
"version": "0.17.0"
|
|
417
417
|
},
|
|
418
|
-
"contentDigest": "
|
|
418
|
+
"contentDigest": "0b2d8e0c4d0ae6336c733ff2102d6911a3bd4298394eddd9f40eefaeb884903c",
|
|
419
419
|
"digestExcludes": []
|
|
420
420
|
},
|
|
421
421
|
{
|
|
@@ -426,7 +426,7 @@
|
|
|
426
426
|
"id": "first-party",
|
|
427
427
|
"type": "first-party",
|
|
428
428
|
"package": "@1aboveio/skills",
|
|
429
|
-
"version": "0.
|
|
429
|
+
"version": "0.17.0"
|
|
430
430
|
},
|
|
431
431
|
"contentDigest": "b5af4dccf703362d4f41cac4fdff48305f652a00338d85975a2e5c35ec6bc61c",
|
|
432
432
|
"digestExcludes": []
|
|
@@ -439,7 +439,7 @@
|
|
|
439
439
|
"id": "first-party",
|
|
440
440
|
"type": "first-party",
|
|
441
441
|
"package": "@1aboveio/skills",
|
|
442
|
-
"version": "0.
|
|
442
|
+
"version": "0.17.0"
|
|
443
443
|
},
|
|
444
444
|
"contentDigest": "f048fd00c69f2dc666fc7a3096cfeee6dfba73933bfb69602f3f0e26159798cc",
|
|
445
445
|
"digestExcludes": []
|
|
@@ -452,7 +452,7 @@
|
|
|
452
452
|
"id": "first-party",
|
|
453
453
|
"type": "first-party",
|
|
454
454
|
"package": "@1aboveio/skills",
|
|
455
|
-
"version": "0.
|
|
455
|
+
"version": "0.17.0"
|
|
456
456
|
},
|
|
457
457
|
"contentDigest": "90a7c4e1ad6da1e632ea2c5259e4967ffebb84353adccbca8dfc5d6bc50b60c1",
|
|
458
458
|
"digestExcludes": []
|
|
@@ -465,15 +465,15 @@
|
|
|
465
465
|
"id": "first-party",
|
|
466
466
|
"type": "first-party",
|
|
467
467
|
"package": "@1aboveio/skills",
|
|
468
|
-
"version": "0.
|
|
468
|
+
"version": "0.17.0"
|
|
469
469
|
},
|
|
470
|
-
"contentDigest": "
|
|
470
|
+
"contentDigest": "4d2242d41c7c57e24119b7cd974a88dd97cf526a8f76e6825385060ff86095c8",
|
|
471
471
|
"digestExcludes": [
|
|
472
472
|
"coherence/workflow.json"
|
|
473
473
|
]
|
|
474
474
|
}
|
|
475
475
|
],
|
|
476
|
-
"releaseIdentity": "
|
|
476
|
+
"releaseIdentity": "4a75f070c64c9f24bfbb250be0706a55f6fc3bf071d537200a0a5a91378a4959",
|
|
477
477
|
"lifecycleAuthority": "native-skills-cli",
|
|
478
478
|
"repairRecipe": {
|
|
479
479
|
"id": "engineering-workflow-dependency-first",
|
|
@@ -531,7 +531,7 @@
|
|
|
531
531
|
"sourceId": "first-party",
|
|
532
532
|
"sourceType": "first-party",
|
|
533
533
|
"package": "@1aboveio/skills",
|
|
534
|
-
"version": "0.
|
|
534
|
+
"version": "0.17.0",
|
|
535
535
|
"installPath": null,
|
|
536
536
|
"members": [
|
|
537
537
|
"harness-runtime",
|
|
@@ -547,7 +547,7 @@
|
|
|
547
547
|
"commands": [
|
|
548
548
|
{
|
|
549
549
|
"transport": "npm",
|
|
550
|
-
"command": "npx @1aboveio/skills@0.
|
|
550
|
+
"command": "npx @1aboveio/skills@0.17.0 install --group engineering-workflow --yes"
|
|
551
551
|
}
|
|
552
552
|
],
|
|
553
553
|
"onFailure": {
|
|
@@ -237,7 +237,7 @@
|
|
|
237
237
|
"id": "first-party",
|
|
238
238
|
"type": "first-party",
|
|
239
239
|
"package": "@1aboveio/skills",
|
|
240
|
-
"version": "0.
|
|
240
|
+
"version": "0.17.0"
|
|
241
241
|
}
|
|
242
242
|
},
|
|
243
243
|
{
|
|
@@ -248,7 +248,7 @@
|
|
|
248
248
|
"id": "first-party",
|
|
249
249
|
"type": "first-party",
|
|
250
250
|
"package": "@1aboveio/skills",
|
|
251
|
-
"version": "0.
|
|
251
|
+
"version": "0.17.0"
|
|
252
252
|
}
|
|
253
253
|
},
|
|
254
254
|
{
|
|
@@ -259,7 +259,7 @@
|
|
|
259
259
|
"id": "first-party",
|
|
260
260
|
"type": "first-party",
|
|
261
261
|
"package": "@1aboveio/skills",
|
|
262
|
-
"version": "0.
|
|
262
|
+
"version": "0.17.0"
|
|
263
263
|
}
|
|
264
264
|
},
|
|
265
265
|
{
|
|
@@ -270,7 +270,7 @@
|
|
|
270
270
|
"id": "first-party",
|
|
271
271
|
"type": "first-party",
|
|
272
272
|
"package": "@1aboveio/skills",
|
|
273
|
-
"version": "0.
|
|
273
|
+
"version": "0.17.0"
|
|
274
274
|
}
|
|
275
275
|
},
|
|
276
276
|
{
|
|
@@ -281,7 +281,7 @@
|
|
|
281
281
|
"id": "first-party",
|
|
282
282
|
"type": "first-party",
|
|
283
283
|
"package": "@1aboveio/skills",
|
|
284
|
-
"version": "0.
|
|
284
|
+
"version": "0.17.0"
|
|
285
285
|
}
|
|
286
286
|
},
|
|
287
287
|
{
|
|
@@ -292,7 +292,7 @@
|
|
|
292
292
|
"id": "first-party",
|
|
293
293
|
"type": "first-party",
|
|
294
294
|
"package": "@1aboveio/skills",
|
|
295
|
-
"version": "0.
|
|
295
|
+
"version": "0.17.0"
|
|
296
296
|
}
|
|
297
297
|
},
|
|
298
298
|
{
|
|
@@ -303,7 +303,7 @@
|
|
|
303
303
|
"id": "first-party",
|
|
304
304
|
"type": "first-party",
|
|
305
305
|
"package": "@1aboveio/skills",
|
|
306
|
-
"version": "0.
|
|
306
|
+
"version": "0.17.0"
|
|
307
307
|
}
|
|
308
308
|
},
|
|
309
309
|
{
|
|
@@ -314,7 +314,7 @@
|
|
|
314
314
|
"id": "first-party",
|
|
315
315
|
"type": "first-party",
|
|
316
316
|
"package": "@1aboveio/skills",
|
|
317
|
-
"version": "0.
|
|
317
|
+
"version": "0.17.0"
|
|
318
318
|
}
|
|
319
319
|
},
|
|
320
320
|
{
|
|
@@ -325,7 +325,7 @@
|
|
|
325
325
|
"id": "first-party",
|
|
326
326
|
"type": "first-party",
|
|
327
327
|
"package": "@1aboveio/skills",
|
|
328
|
-
"version": "0.
|
|
328
|
+
"version": "0.17.0"
|
|
329
329
|
}
|
|
330
330
|
}
|
|
331
331
|
],
|
|
@@ -426,7 +426,7 @@
|
|
|
426
426
|
"sourceId": "first-party",
|
|
427
427
|
"sourceType": "first-party",
|
|
428
428
|
"package": "@1aboveio/skills",
|
|
429
|
-
"version": "0.
|
|
429
|
+
"version": "0.17.0",
|
|
430
430
|
"installPath": null,
|
|
431
431
|
"members": [
|
|
432
432
|
"harness-runtime",
|
|
@@ -442,7 +442,7 @@
|
|
|
442
442
|
"commands": [
|
|
443
443
|
{
|
|
444
444
|
"transport": "npm",
|
|
445
|
-
"command": "npx @1aboveio/skills@0.
|
|
445
|
+
"command": "npx @1aboveio/skills@0.17.0 install --group engineering-workflow --yes"
|
|
446
446
|
}
|
|
447
447
|
],
|
|
448
448
|
"onFailure": {
|
|
@@ -3412,7 +3412,7 @@ export const WORKFLOW_PREFLIGHT_COMMANDS = Object.freeze([
|
|
|
3412
3412
|
|
|
3413
3413
|
const WORKFLOW_VERIFIER_URL = new URL('../../engineering-runtime/scripts/workflow-coherence.mjs', import.meta.url)
|
|
3414
3414
|
const WORKFLOW_FALLBACK_POLICY_URL = new URL('../generated/workflow-repair-policy.json', import.meta.url)
|
|
3415
|
-
export const WORKFLOW_TRUSTED_FALLBACK_POLICY_SHA256 = '
|
|
3415
|
+
export const WORKFLOW_TRUSTED_FALLBACK_POLICY_SHA256 = 'a6d80d500e43b660220f71f9764e5e6c905bf1955d63f8733d115b6c1a601448'
|
|
3416
3416
|
const WORKFLOW_REPAIR_RECIPE_REFERENCE = Object.freeze({
|
|
3417
3417
|
id: 'engineering-workflow-dependency-first',
|
|
3418
3418
|
generatedFrom: 'skills/distribution/generated/recipes.json',
|