@dzhechkov/harness-core 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dz-manifest.json +66 -14
- package/README.md +12 -1
- package/dist/amendment-trace.d.ts +98 -0
- package/dist/amendment-trace.d.ts.map +1 -0
- package/dist/amendment-trace.js +275 -0
- package/dist/amendment-trace.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +4 -1
- package/dist/patterns.js.map +1 -1
- package/dist/run-records.d.ts +66 -0
- package/dist/run-records.d.ts.map +1 -0
- package/dist/run-records.js +169 -0
- package/dist/run-records.js.map +1 -0
- package/package.json +4 -4
- package/sbom.json +143 -13
- package/src/amendment-trace.ts +348 -0
- package/src/index.ts +24 -0
- package/src/patterns.ts +4 -1
- package/src/run-records.ts +220 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Witnessed run records — the decision half of `dz feature-adr-record` (ADR-001 … ADR-003).
|
|
3
|
+
*
|
|
4
|
+
* Two durable writers in the /feature-adr workflow still handed a subagent a PRE-BAKED shell string
|
|
5
|
+
* carrying their payload: the run-cost ledger and the training-pair capture. That is the shape a
|
|
6
|
+
* security classifier blocked NINE times in one run — one entity instructing another to append state
|
|
7
|
+
* it never verified. The checkpoint writer was migrated for that reason; these two were left behind.
|
|
8
|
+
*
|
|
9
|
+
* The role change is the point: the subagent stops being a COURIER (handed a shell string, appends
|
|
10
|
+
* it) and becomes a CALLER (handed arguments; the command decides). A courier can neither refuse nor
|
|
11
|
+
* verify.
|
|
12
|
+
*
|
|
13
|
+
* Pure: payload in, verdict out. The CLI owns paths, the append, the read-back and the exit code.
|
|
14
|
+
*/
|
|
15
|
+
/** A serialised record line above this is refused rather than truncated (acid case A2). */
|
|
16
|
+
export const RECORD_MAX_LINE_CHARS = 24_000;
|
|
17
|
+
/** Fields every ledger row must carry before it is worth writing down. */
|
|
18
|
+
const LEDGER_REQUIRED = ['slug', 'stage'];
|
|
19
|
+
/** Fields every training pair must carry — the dataset is worthless without input/output. */
|
|
20
|
+
const PAIR_REQUIRED = ['slug', 'stage', 'input', 'output'];
|
|
21
|
+
const refuse = (reason) => ({ verdict: 'refused', exit: 2, reason, blocking: false, line: null });
|
|
22
|
+
/** `duplicate` and `skipped` both wrote nothing and both are fine — but they are DIFFERENT facts. */
|
|
23
|
+
const noop = (verdict, reason) => ({
|
|
24
|
+
verdict,
|
|
25
|
+
exit: 0,
|
|
26
|
+
reason,
|
|
27
|
+
blocking: false,
|
|
28
|
+
line: null,
|
|
29
|
+
});
|
|
30
|
+
function shapeMismatch(kind, payload) {
|
|
31
|
+
// AM-1 FIRST, before the required-field sweep. A ledger row offered as a training pair fails BOTH
|
|
32
|
+
// checks, and the wrong-kind reason is the one that tells the caller what actually happened —
|
|
33
|
+
// "missing field `output`" sends them looking for a field they never meant to send.
|
|
34
|
+
if (kind === 'ledger' && 'input' in payload && 'output' in payload) {
|
|
35
|
+
// BOTH fields together are the training-pair signature. Either one alone is not: a ledger row may
|
|
36
|
+
// legitimately carry `input: {cached_tokens: 80}` (cross-family review, 2026-08-21) and refusing
|
|
37
|
+
// it would make the command reject honest data on a name collision.
|
|
38
|
+
return 'this payload carries BOTH `input` and `output` — it is a training pair, not a ledger row';
|
|
39
|
+
}
|
|
40
|
+
if (kind === 'training-pair' && 'tokens' in payload && !('input' in payload)) {
|
|
41
|
+
return 'this payload looks like a ledger row (`tokens` without `input`), not a training pair';
|
|
42
|
+
}
|
|
43
|
+
const required = kind === 'ledger' ? LEDGER_REQUIRED : PAIR_REQUIRED;
|
|
44
|
+
for (const field of required) {
|
|
45
|
+
const v = payload[field];
|
|
46
|
+
if (v === undefined || v === null)
|
|
47
|
+
return `a ${kind} record is missing the required field \`${field}\``;
|
|
48
|
+
// EMPTY is not present. An earlier version checked only string-emptiness, so `input: []` and
|
|
49
|
+
// `output: {}` satisfied the requirement and an empty record reached the file — a pair with no
|
|
50
|
+
// content is worse than no pair, because it looks captured.
|
|
51
|
+
if (typeof v === 'string' && v.trim() === '')
|
|
52
|
+
return `a ${kind} record has an EMPTY \`${field}\``;
|
|
53
|
+
if (Array.isArray(v) && v.length === 0)
|
|
54
|
+
return `a ${kind} record has an EMPTY \`${field}\` (empty array)`;
|
|
55
|
+
if (typeof v === 'object' && !Array.isArray(v) && Object.keys(v).length === 0) {
|
|
56
|
+
return `a ${kind} record has an EMPTY \`${field}\` (empty object)`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
export function decideRecordWrite(input) {
|
|
62
|
+
const { kind, payloadRaw, stage } = input;
|
|
63
|
+
if (kind !== 'ledger' && kind !== 'training-pair') {
|
|
64
|
+
return refuse(`unknown --kind \`${String(kind)}\` — expected ledger or training-pair`);
|
|
65
|
+
}
|
|
66
|
+
if (typeof stage !== 'string' || stage.trim() === '')
|
|
67
|
+
return refuse('--stage is required');
|
|
68
|
+
if (input.stageProducedResult === false) {
|
|
69
|
+
return refuse(`stage \`${stage}\` produced no result — there is nothing to record`);
|
|
70
|
+
}
|
|
71
|
+
let payload;
|
|
72
|
+
try {
|
|
73
|
+
payload = JSON.parse(payloadRaw);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return refuse('the payload is not valid JSON — refused before any write, the target is untouched');
|
|
77
|
+
}
|
|
78
|
+
if (payload === null || typeof payload !== 'object' || Array.isArray(payload)) {
|
|
79
|
+
return refuse('the payload must be a JSON object');
|
|
80
|
+
}
|
|
81
|
+
const obj = payload;
|
|
82
|
+
const mismatch = shapeMismatch(kind, obj);
|
|
83
|
+
if (mismatch !== null)
|
|
84
|
+
return refuse(mismatch);
|
|
85
|
+
// The record is filed under `--stage`, and the payload carries its own. A disagreement means the
|
|
86
|
+
// row would land in the wrong stage's file (pairs) or under a wrong label (ledger) — both available
|
|
87
|
+
// here, so leaving them uncompared was a free check declined.
|
|
88
|
+
const payloadStage = obj['stage'];
|
|
89
|
+
if (typeof payloadStage === 'string' && payloadStage !== stage) {
|
|
90
|
+
return refuse(`the payload's stage \`${payloadStage}\` disagrees with --stage \`${stage}\` — the record would be filed under the wrong stage`);
|
|
91
|
+
}
|
|
92
|
+
// The no-write outcomes are checked AFTER the payload is validated: reporting `duplicate` for a
|
|
93
|
+
// malformed payload would hide a real defect behind a benign-looking verdict.
|
|
94
|
+
// A mark whose TARGET does not exist is STALE: a previous run took the mark and died before writing.
|
|
95
|
+
// Reporting `duplicate` there lets one crash lose the record forever — the silent-loss shape this
|
|
96
|
+
// whole feature removes (cross-family review, 2026-08-21). A stale mark does NOT stop the write; it
|
|
97
|
+
// is recorded on the decision so the caller can say why it proceeded anyway.
|
|
98
|
+
const staleMark = input.markExists === true && input.targetExists === false;
|
|
99
|
+
if (input.markExists === true && !staleMark) {
|
|
100
|
+
return noop('duplicate', 'a mark for this record already exists — another run captured it first');
|
|
101
|
+
}
|
|
102
|
+
if (input.targetHasPair === true) {
|
|
103
|
+
return noop('skipped', 'the target already holds this record — nothing to add');
|
|
104
|
+
}
|
|
105
|
+
// The timestamp goes in BEFORE serialisation. The shell `sed` this replaces rewrote `"date":null`
|
|
106
|
+
// inside an already-serialised document — text surgery on a structured value, and the exact place
|
|
107
|
+
// a payload containing that literal token could corrupt itself.
|
|
108
|
+
const stamped = { ...obj };
|
|
109
|
+
if (input.timestamp != null && input.timestamp !== '') {
|
|
110
|
+
// An EMPTY STRING is a gap, not a value. Stamping only over null/undefined let
|
|
111
|
+
// `"date":""` through as `written` (cross-family review, 2026-08-21) — a row that looks recorded
|
|
112
|
+
// and carries no date.
|
|
113
|
+
const isGap = (v) => v === null || v === undefined || (typeof v === 'string' && v.trim() === '');
|
|
114
|
+
if (kind === 'ledger' && isGap(stamped['date']))
|
|
115
|
+
stamped['date'] = input.timestamp.slice(0, 10);
|
|
116
|
+
if (kind === 'training-pair' && isGap(stamped['ts']))
|
|
117
|
+
stamped['ts'] = input.timestamp;
|
|
118
|
+
}
|
|
119
|
+
let line;
|
|
120
|
+
try {
|
|
121
|
+
line = JSON.stringify(stamped);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return refuse('the payload could not be serialised (circular or unsupported value)');
|
|
125
|
+
}
|
|
126
|
+
const cap = input.maxChars ?? RECORD_MAX_LINE_CHARS;
|
|
127
|
+
if (line.length > cap) {
|
|
128
|
+
return refuse(`the serialised record is ${line.length} chars, above the ${cap}-char cap — refused rather than truncated`);
|
|
129
|
+
}
|
|
130
|
+
if (line.includes('\n'))
|
|
131
|
+
return refuse('the serialised record contains a newline — one record is one line');
|
|
132
|
+
return {
|
|
133
|
+
verdict: 'written',
|
|
134
|
+
exit: 0,
|
|
135
|
+
reason: staleMark
|
|
136
|
+
? `${kind} record ready to append (a STALE mark was found — its target is absent, so a previous holder died before writing)`
|
|
137
|
+
: `${kind} record ready to append`,
|
|
138
|
+
blocking: false,
|
|
139
|
+
line,
|
|
140
|
+
staleMark,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/** The read-back verdict (ADR-002): equal bytes or NOT written. Never inferred from the absence of an error. */
|
|
144
|
+
export function decideReadBack(appended, lastLineOnDisk) {
|
|
145
|
+
if (lastLineOnDisk === null) {
|
|
146
|
+
return {
|
|
147
|
+
verdict: 'not-verified',
|
|
148
|
+
exit: 3,
|
|
149
|
+
reason: 'the record was appended but the file could not be read back — treat this as NOT written',
|
|
150
|
+
blocking: false,
|
|
151
|
+
line: appended,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
if (lastLineOnDisk !== appended) {
|
|
155
|
+
return {
|
|
156
|
+
verdict: 'not-verified',
|
|
157
|
+
exit: 3,
|
|
158
|
+
reason: 'the last line on disk differs from what was appended — treat this as NOT written',
|
|
159
|
+
blocking: false,
|
|
160
|
+
line: appended,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return { verdict: 'written', exit: 0, reason: 'appended and verified by re-reading the tail', blocking: false, line: appended };
|
|
164
|
+
}
|
|
165
|
+
/** The one line every caller reads last, in the shape the other gates use. */
|
|
166
|
+
export function recordVerdictLine(kind, stage, d) {
|
|
167
|
+
return `feature-adr record (${kind}/${stage}): ${d.verdict.toUpperCase()} — ${d.reason}`;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=run-records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-records.js","sourceRoot":"","sources":["../src/run-records.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/harness-core",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -35,12 +35,12 @@
|
|
|
35
35
|
"proper-lockfile": "^4.1.2",
|
|
36
36
|
"yaml": "^2.0.0",
|
|
37
37
|
"@dzhechkov/adapter-copilot": "0.1.1",
|
|
38
|
-
"@dzhechkov/adapter-gemini": "0.1.1",
|
|
39
|
-
"@dzhechkov/adapter-windsurf": "0.1.1",
|
|
40
38
|
"@dzhechkov/adapter-agents-md": "0.1.1",
|
|
39
|
+
"@dzhechkov/adapter-gemini": "0.1.1",
|
|
41
40
|
"@dzhechkov/adapter-cursor": "0.1.1",
|
|
42
41
|
"@dzhechkov/core": "0.2.15",
|
|
43
|
-
"@dzhechkov/
|
|
42
|
+
"@dzhechkov/adapter-windsurf": "0.1.1",
|
|
43
|
+
"@dzhechkov/memory": "0.2.10"
|
|
44
44
|
},
|
|
45
45
|
"peerDependenciesMeta": {
|
|
46
46
|
"@ruvector/rvf": {
|
package/sbom.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"hashes": [
|
|
16
16
|
{
|
|
17
17
|
"alg": "SHA-256",
|
|
18
|
-
"content": "
|
|
18
|
+
"content": "2ba0bb6639cdc6918fa61ec15a344e9a97988e6a212cc6d9b5c67364307a7359"
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
21
|
},
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"hashes": [
|
|
26
26
|
{
|
|
27
27
|
"alg": "SHA-256",
|
|
28
|
-
"content": "
|
|
28
|
+
"content": "3d0f40f8e46f15d06ed65efa568ad9f34c36c519c468db401663d8a3badbb734"
|
|
29
29
|
}
|
|
30
30
|
]
|
|
31
31
|
},
|
|
@@ -149,6 +149,46 @@
|
|
|
149
149
|
}
|
|
150
150
|
]
|
|
151
151
|
},
|
|
152
|
+
{
|
|
153
|
+
"type": "file",
|
|
154
|
+
"name": "dist/amendment-trace.d.ts",
|
|
155
|
+
"hashes": [
|
|
156
|
+
{
|
|
157
|
+
"alg": "SHA-256",
|
|
158
|
+
"content": "5e38fdb88bf848eaf045f7e8450bd7584dedd89c957d6bcbf3f33688acd59ae8"
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"type": "file",
|
|
164
|
+
"name": "dist/amendment-trace.d.ts.map",
|
|
165
|
+
"hashes": [
|
|
166
|
+
{
|
|
167
|
+
"alg": "SHA-256",
|
|
168
|
+
"content": "823cd1ec281dc9e4a368b147413379e3ba6e343b7240acc233affd64eebc04a4"
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"type": "file",
|
|
174
|
+
"name": "dist/amendment-trace.js",
|
|
175
|
+
"hashes": [
|
|
176
|
+
{
|
|
177
|
+
"alg": "SHA-256",
|
|
178
|
+
"content": "36373fe71098e0a73fbffa08d0732ab5da526293f0c804c08a4aa6f9cd20c905"
|
|
179
|
+
}
|
|
180
|
+
]
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"type": "file",
|
|
184
|
+
"name": "dist/amendment-trace.js.map",
|
|
185
|
+
"hashes": [
|
|
186
|
+
{
|
|
187
|
+
"alg": "SHA-256",
|
|
188
|
+
"content": "4c14ec5efa950f7b13537ccce4c7cc80cb2a54af53760474856153f771407681"
|
|
189
|
+
}
|
|
190
|
+
]
|
|
191
|
+
},
|
|
152
192
|
{
|
|
153
193
|
"type": "file",
|
|
154
194
|
"name": "dist/apply.d.ts",
|
|
@@ -1515,7 +1555,7 @@
|
|
|
1515
1555
|
"hashes": [
|
|
1516
1556
|
{
|
|
1517
1557
|
"alg": "SHA-256",
|
|
1518
|
-
"content": "
|
|
1558
|
+
"content": "417b6de4c4bc836d72513abd1893e6dd84e58fabd85fb3795e2b2bb0f2e89baf"
|
|
1519
1559
|
}
|
|
1520
1560
|
]
|
|
1521
1561
|
},
|
|
@@ -1525,7 +1565,7 @@
|
|
|
1525
1565
|
"hashes": [
|
|
1526
1566
|
{
|
|
1527
1567
|
"alg": "SHA-256",
|
|
1528
|
-
"content": "
|
|
1568
|
+
"content": "560c4441d001498a8a1170225b0e766b24ecc95cb2a133ed155f47fbfc555cbf"
|
|
1529
1569
|
}
|
|
1530
1570
|
]
|
|
1531
1571
|
},
|
|
@@ -1535,7 +1575,7 @@
|
|
|
1535
1575
|
"hashes": [
|
|
1536
1576
|
{
|
|
1537
1577
|
"alg": "SHA-256",
|
|
1538
|
-
"content": "
|
|
1578
|
+
"content": "9fa573d21a2aad30341127e8d146fa6338e1e6d2706075971e19b852db2cdc8a"
|
|
1539
1579
|
}
|
|
1540
1580
|
]
|
|
1541
1581
|
},
|
|
@@ -1545,7 +1585,7 @@
|
|
|
1545
1585
|
"hashes": [
|
|
1546
1586
|
{
|
|
1547
1587
|
"alg": "SHA-256",
|
|
1548
|
-
"content": "
|
|
1588
|
+
"content": "adf38e34c552a57ac39760f5782b184ab465298a4505110b4e951c66a02da7e1"
|
|
1549
1589
|
}
|
|
1550
1590
|
]
|
|
1551
1591
|
},
|
|
@@ -2245,7 +2285,7 @@
|
|
|
2245
2285
|
"hashes": [
|
|
2246
2286
|
{
|
|
2247
2287
|
"alg": "SHA-256",
|
|
2248
|
-
"content": "
|
|
2288
|
+
"content": "6cb5a710dcc1d1ca1bb8fa9350c9751da58b6bc8cf48688eb191574cd1e84cf5"
|
|
2249
2289
|
}
|
|
2250
2290
|
]
|
|
2251
2291
|
},
|
|
@@ -2255,7 +2295,7 @@
|
|
|
2255
2295
|
"hashes": [
|
|
2256
2296
|
{
|
|
2257
2297
|
"alg": "SHA-256",
|
|
2258
|
-
"content": "
|
|
2298
|
+
"content": "15992b9d7a69a2b91597aaa05901a1656fdcbed54dfa23ffc9d78f25432ead48"
|
|
2259
2299
|
}
|
|
2260
2300
|
]
|
|
2261
2301
|
},
|
|
@@ -2265,7 +2305,7 @@
|
|
|
2265
2305
|
"hashes": [
|
|
2266
2306
|
{
|
|
2267
2307
|
"alg": "SHA-256",
|
|
2268
|
-
"content": "
|
|
2308
|
+
"content": "c0bdd22f1dede62cc6cc0efa644d4a59bbcf69fbe69a95c13fcd313fda4b1851"
|
|
2269
2309
|
}
|
|
2270
2310
|
]
|
|
2271
2311
|
},
|
|
@@ -2949,6 +2989,46 @@
|
|
|
2949
2989
|
}
|
|
2950
2990
|
]
|
|
2951
2991
|
},
|
|
2992
|
+
{
|
|
2993
|
+
"type": "file",
|
|
2994
|
+
"name": "dist/run-records.d.ts",
|
|
2995
|
+
"hashes": [
|
|
2996
|
+
{
|
|
2997
|
+
"alg": "SHA-256",
|
|
2998
|
+
"content": "f53f7fba2d81cb1b71127781ca879fb0f8dd4e91f9a21c0230b68c20c4aa6df0"
|
|
2999
|
+
}
|
|
3000
|
+
]
|
|
3001
|
+
},
|
|
3002
|
+
{
|
|
3003
|
+
"type": "file",
|
|
3004
|
+
"name": "dist/run-records.d.ts.map",
|
|
3005
|
+
"hashes": [
|
|
3006
|
+
{
|
|
3007
|
+
"alg": "SHA-256",
|
|
3008
|
+
"content": "c10fc92fda6183599b92abcdf2933ee8408f026ac73a4e8252ac36b693c18545"
|
|
3009
|
+
}
|
|
3010
|
+
]
|
|
3011
|
+
},
|
|
3012
|
+
{
|
|
3013
|
+
"type": "file",
|
|
3014
|
+
"name": "dist/run-records.js",
|
|
3015
|
+
"hashes": [
|
|
3016
|
+
{
|
|
3017
|
+
"alg": "SHA-256",
|
|
3018
|
+
"content": "a88eb998f172e893bd6bcf800e8a2954fd6ca53e4d7b05730748276d23d8e7f0"
|
|
3019
|
+
}
|
|
3020
|
+
]
|
|
3021
|
+
},
|
|
3022
|
+
{
|
|
3023
|
+
"type": "file",
|
|
3024
|
+
"name": "dist/run-records.js.map",
|
|
3025
|
+
"hashes": [
|
|
3026
|
+
{
|
|
3027
|
+
"alg": "SHA-256",
|
|
3028
|
+
"content": "f1219ebf7414b0a8fcf88510b76f9bb82c9580637ef8863e7e02f10409c0c432"
|
|
3029
|
+
}
|
|
3030
|
+
]
|
|
3031
|
+
},
|
|
2952
3032
|
{
|
|
2953
3033
|
"type": "file",
|
|
2954
3034
|
"name": "dist/safla-delta.d.ts",
|
|
@@ -3875,7 +3955,7 @@
|
|
|
3875
3955
|
"hashes": [
|
|
3876
3956
|
{
|
|
3877
3957
|
"alg": "SHA-256",
|
|
3878
|
-
"content": "
|
|
3958
|
+
"content": "a79b206556e86f770f3d5e89aea516cf0117402f2cf0505466e2228559a2075c"
|
|
3879
3959
|
}
|
|
3880
3960
|
]
|
|
3881
3961
|
},
|
|
@@ -3919,6 +3999,16 @@
|
|
|
3919
3999
|
}
|
|
3920
4000
|
]
|
|
3921
4001
|
},
|
|
4002
|
+
{
|
|
4003
|
+
"type": "file",
|
|
4004
|
+
"name": "src/amendment-trace.ts",
|
|
4005
|
+
"hashes": [
|
|
4006
|
+
{
|
|
4007
|
+
"alg": "SHA-256",
|
|
4008
|
+
"content": "547ee200ce8d1f8c9907dcadc39a0ed386dd5a5491d3f6797e94c20a3a160c64"
|
|
4009
|
+
}
|
|
4010
|
+
]
|
|
4011
|
+
},
|
|
3922
4012
|
{
|
|
3923
4013
|
"type": "file",
|
|
3924
4014
|
"name": "src/apply.ts",
|
|
@@ -4265,7 +4355,7 @@
|
|
|
4265
4355
|
"hashes": [
|
|
4266
4356
|
{
|
|
4267
4357
|
"alg": "SHA-256",
|
|
4268
|
-
"content": "
|
|
4358
|
+
"content": "f53403a6ae47ca25e436a2fcba9566baa895110132a975f4ce62465db932c0ee"
|
|
4269
4359
|
}
|
|
4270
4360
|
]
|
|
4271
4361
|
},
|
|
@@ -4445,7 +4535,7 @@
|
|
|
4445
4535
|
"hashes": [
|
|
4446
4536
|
{
|
|
4447
4537
|
"alg": "SHA-256",
|
|
4448
|
-
"content": "
|
|
4538
|
+
"content": "9dbc7e3c2746fae37fb481fc153244106071a6da47948e6a7ee6c287f2249416"
|
|
4449
4539
|
}
|
|
4450
4540
|
]
|
|
4451
4541
|
},
|
|
@@ -4609,6 +4699,16 @@
|
|
|
4609
4699
|
}
|
|
4610
4700
|
]
|
|
4611
4701
|
},
|
|
4702
|
+
{
|
|
4703
|
+
"type": "file",
|
|
4704
|
+
"name": "src/run-records.ts",
|
|
4705
|
+
"hashes": [
|
|
4706
|
+
{
|
|
4707
|
+
"alg": "SHA-256",
|
|
4708
|
+
"content": "8a000d7ecd6d729b2e5547e12d098ed9f16bd3c27d456e0589130147b2385126"
|
|
4709
|
+
}
|
|
4710
|
+
]
|
|
4711
|
+
},
|
|
4612
4712
|
{
|
|
4613
4713
|
"type": "file",
|
|
4614
4714
|
"name": "src/safla-delta.ts",
|
|
@@ -4889,6 +4989,16 @@
|
|
|
4889
4989
|
}
|
|
4890
4990
|
]
|
|
4891
4991
|
},
|
|
4992
|
+
{
|
|
4993
|
+
"type": "file",
|
|
4994
|
+
"name": "test/amendment-trace.test.ts",
|
|
4995
|
+
"hashes": [
|
|
4996
|
+
{
|
|
4997
|
+
"alg": "SHA-256",
|
|
4998
|
+
"content": "fade5a0516b626154a936230ac7f001af048c02e91f338b44270e51a9e81fffd"
|
|
4999
|
+
}
|
|
5000
|
+
]
|
|
5001
|
+
},
|
|
4892
5002
|
{
|
|
4893
5003
|
"type": "file",
|
|
4894
5004
|
"name": "test/apply.test.ts",
|
|
@@ -5445,7 +5555,7 @@
|
|
|
5445
5555
|
"hashes": [
|
|
5446
5556
|
{
|
|
5447
5557
|
"alg": "SHA-256",
|
|
5448
|
-
"content": "
|
|
5558
|
+
"content": "0e4a7317554dd78d87d729374e21a34c7519075e9ac4547e3de0d06f774fa35d"
|
|
5449
5559
|
}
|
|
5450
5560
|
]
|
|
5451
5561
|
},
|
|
@@ -6109,6 +6219,16 @@
|
|
|
6109
6219
|
}
|
|
6110
6220
|
]
|
|
6111
6221
|
},
|
|
6222
|
+
{
|
|
6223
|
+
"type": "file",
|
|
6224
|
+
"name": "test/pattern-boost-unicode.test.ts",
|
|
6225
|
+
"hashes": [
|
|
6226
|
+
{
|
|
6227
|
+
"alg": "SHA-256",
|
|
6228
|
+
"content": "bb3716152de8c062b66f8f8ab0333c7d96a57863dd89f1bcfc9565f5b240f8c1"
|
|
6229
|
+
}
|
|
6230
|
+
]
|
|
6231
|
+
},
|
|
6112
6232
|
{
|
|
6113
6233
|
"type": "file",
|
|
6114
6234
|
"name": "test/patterns.test.ts",
|
|
@@ -6289,6 +6409,16 @@
|
|
|
6289
6409
|
}
|
|
6290
6410
|
]
|
|
6291
6411
|
},
|
|
6412
|
+
{
|
|
6413
|
+
"type": "file",
|
|
6414
|
+
"name": "test/run-records.test.ts",
|
|
6415
|
+
"hashes": [
|
|
6416
|
+
{
|
|
6417
|
+
"alg": "SHA-256",
|
|
6418
|
+
"content": "8c7e65a5a881f67e2ba426c061f67131536902ec902741cc248a0b30d6963535"
|
|
6419
|
+
}
|
|
6420
|
+
]
|
|
6421
|
+
},
|
|
6292
6422
|
{
|
|
6293
6423
|
"type": "file",
|
|
6294
6424
|
"name": "test/safla-delta.test.ts",
|